Groovyで特定の日時に新しいDate
を作成する方法は、Date.parse
メソッドでString
から解析する以外の方法があるのだろうか。 GroovyでDate
作成の完全なリストを取得できますか?
既存のJavaメソッドを使用して日付を作成できます。
_// takes the date encoded as milliseconds since midnight, January 1, 1970 UTC
def mydate = new Date(System.currentTimeMillis())
// create from an existing Calendar object
def mydate = new GregorianCalendar(2014, Calendar.APRIL, 3, 1, 23, 45).time
_
Groovyは、日付を作成するための合理化された拡張機能も提供します。 Date.parse()
および Date.parseToStringDate()
Stringから解析します。 Date.copyWith()
メソッドは、マップから日付を作成します。次のように使用できます。
_// uses the format strings from Java's SimpleDateFormat
def mydate = Date.parse("yyyy-MM-dd hh:mm:ss", "2014-04-03 1:23:45")
// uses a format equivalent to EEE MMM dd HH:mm:ss zzz yyyy
def mydate = Date.parseToStringDate("Thu Apr 03 01:23:45 UTC 2014")
def mydate = new Date().copyWith(
year: 2014,
month: Calendar.APRIL,
dayOfMonth: 3,
hourOfDay: 1,
minute: 23,
second: 45)
_
他の答えはJava 8以降です。Java.util.Date/ .Calendar/.GregorianCalendarなどの古いレガシー日時クラスは、設計が不十分で、混乱を招き、面倒。
Java.time フレームワークは、これらの古いクラスに取って代わります。
Groovyはもちろんこれらのクラスを使用できます。 Groovyの構文はわかりませんが、この単純なJavaの例は簡単に変更できるはずです。
LocalDate
/LocalTime
LocalDate
およびLocalTime
クラスにはタイムゾーンの概念がありません。そのため、タイムライン上の実際の瞬間を表していません。
LocalDate localDate = LocalDate( 2016 , Month.JANUARY , 2 ); // year, month, date.
LocalTime localTime = LocalTime( 12 , 30 , 0 , 0 ); // hour, minute, second, nanosecond.
ZonedDateTime
タイムゾーン( ZoneId
)を適用して、 ZonedDateTime
を取得します。 適切なタイムゾーン名 を使用します。一般的に見られる3〜4ゾーンの略語は使用しないでください。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );
Instant
古い日時クラスを避ける必要があります。ただし、必要に応じて変換できます。 Instant
は、ナノ秒の解像度でUTCのタイムライン上の瞬間を表すJava.timeクラスです。 Instant
へ/から変換するための古いJava.util.Dateクラスで新しいメソッドを探します。 Instant
から必要なZonedDateTime
オブジェクトを抽出できます。
convertingfromJava.timeにはデータ損失が含まれることに注意してください! Java.timeクラスは nanosecond 解像度(小数秒で小数点以下9桁まで)をサポートしますが、古いJava.util.Dateは ミリ秒 (小数点以下3桁まで)のみをサポートします場所)。小数秒の4〜9桁は切り捨てられます。たとえば、2016-04-28T02:05:05.123456789
は2016-04-28T02:05:05.123
に切り捨てられます。
Instant instant = zdt.toInstant();
Java.util.Date utilDate = Java.util.Date.from( instant );
Java.util.DateからInstant
への別の方向に進みます。小数秒の小数点第4位から9位はゼロで、ミリ秒の場合は1位から3位です。
Instant instant = utilDate.toInstant();
私の知る限り、他の方法はありません。 Dateクラスのコンストラクターに正確な時間をミリ秒で渡すこともできますが、最初に時間をミリ秒で取得する必要があります。
多分これは link が役に立つでしょう。
または、次のコードスニペット:
def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
Date()
を使用して現在の日付を取得し、次のように書式設定できます。
/*
y: year
m: month
d: day
h: hour
m: minute
*/
Date().format('yyyy-MM-dd hh-mm')
Date().format('yy/mm/dd hh')
戻り値の型は文字列です。
Groovyは良いです。
new Date(2016-1900, 7, 16, 20, 32, 25)
2016年8月16日火曜日20:32:25 PDT
年をマッサージする必要があることに注意してくださいが、新しいJava必要な秒を表す日付を作成できます。
http://mrhaki.blogspot.com/2009/08/groovy-goodness-working-with-dates.html でさらにGroovyの良さを見ることができます。