web-dev-qa-db-ja.com

特定の日時にGroovyで新しい日付を作成する方法

Groovyで特定の日時に新しいDateを作成する方法は、Date.parseメソッドでStringから解析する以外の方法があるのだろうか。 GroovyでDate作成の完全なリストを取得できますか?

23
michal.kreuzman

既存の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)
_
45
ataylor

他の答えはJava 8以降です。Java.util.Date/ .Calendar/.GregorianCalendarなどの古いレガシー日時クラスは、設計が不十分で、混乱を招き、面倒。

Java.time

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.1234567892016-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();
6
Basil Bourque

私の知る限り、他の方法はありません。 Dateクラスのコンストラクターに正確な時間をミリ秒で渡すこともできますが、最初に時間をミリ秒で取得する必要があります。

多分これは link が役に立つでしょう。

または、次のコードスニペット:

def calendar = new GregorianCalendar(2011,1,7,15,7,23)
def date = calendar.getTime()
println date
2
Opal

Date()を使用して現在の日付を取得し、次のように書式設定できます。

    /*
     y: year
     m: month
     d: day
     h: hour
     m: minute
    */

Date().format('yyyy-MM-dd hh-mm') 
Date().format('yy/mm/dd hh') 

戻り値の型は文字列です。

1

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の良さを見ることができます。

1
CSQ