2017-04-16 7 views
1

私は(私は変更することはできません)、次のコードを使用してデータベースに保存された日付のセットを持っている:Groovyの.format()メソッドで現地時間を表示するにはどうすればよいですか?

Date date = new Date() 
save(date) 

は、ユーザーの中に日付を再フォーマットして表示するグルーヴィーにはクリーンな方法はありませんローカルタイムゾーン?このような...

dateCreated.format('h:mm a MMMM dd, yyyy', Locale.US) 

Groovyに組み込まれているものは何ですか?唯一の解決策はありますか?

import java.text.SimpleDateFormat 

String date = dateCreated.format('h:mm a MMMM dd, yyyy') 
def fmt = new SimpleDateFormat('h:mm a MMMM dd, yyyy', Locale.US); 
Date local_time = fmt.parse(date); 
String formatted_local = local_time.format('h:mm a MMMM dd, yyyy') 
formatted_local 

Groovyの日付のドキュメント:http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Date.html#format(java.lang.String)

参考:How to parse month full form string using DateFormat in Java?

+0

私はあなたの質問には従いませんが、Javaで行うことができると思われる場合は、Javaの抜粋が有効なGroovyであるためGroovyで実行することもできます。 'Date.parse( 'h:mm a MMMM dd、yyyy'、 '2007年6月27日6:31 PM') ' – bdkosher

+0

より普遍的なアプローチはありますか?つまり、日付がデータベースに 'MM-d-yyyy-h-mm-s'の形式で保存されているとします。Date.parseを使用して日付を新しい形式で印刷するにはどうすればよいですか? –

+0

日付はデータベースに文字列として保存されていますか? –

答えて

1

はGroovyでかなり簡単であるべき。

はあなただけの文の下に使用し、特定の日付時刻形式で特定のタイムゾーンに変換する必要がある場合は、日付が出力

Sun Apr 16 11:10:14 UTC 2017 

def date = new Date() println date 

文の下に使用して保存され、想定

println date.format('yyyy/MM/dd HH:mm', TimeZone.getTimeZone('IST')) 

2017/04/16 16:40 

注:ソースがUTC形式で、IST形式に既存の日付を変換しは出力を表示していました。場合

ます(上記で述べたように文字列ではありません)日付オブジェクトが必要な場合は、以下を使用します。

def date = new Date() 
def dtFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
def dt = date.format(dtFormat, TimeZone.getTimeZone('IST')) 
assert dt instanceof String 

def newDate = Date.parse(dtFormat, dt) 
assert newDate instanceof Date 

あなたはすぐにオンラインDemo

+1

FYI、[java.util.Date'](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html)などの面倒な古い日時クラス、 'java.util.Calendar'](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html)、および' java.text。SimpleTextFormat'が[レガシー](https://en.wikipedia.org/wiki/Legacy_system)になりました。[java.time](https://docs.oracle.com/javase/8/docs/api/) java/time/package-summary.html)のクラスです。 –

1

TLみてください。

ZonedDateTime.parse ( 
    "Mon Apr 03 16:49:56 PDT 2017" , 
    DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu", Locale.US) 
) 
DRを

構文

申し訳ありませんが、私はGroovyの構文を知らないので、これはJava構文です。

java.util.Date::toString

あなたは値がjava.util.Date::toStringを呼び出すことにより、テキストデータ型としてデータベースに保存されたことを言っていますか?

これで、java.util.Date::toStringなどのデフォルトの形式で、Mon Apr 03 16:49:56 PDT 2017などの文字列を解析して日付/時刻オブジェクトに戻す必要があります。

まず、日時の値を保存するのは恐ろしい方法であることを既に知っていなければなりません。そのフォーマットは英語を前提とし、小数点以下は切り捨てます。そのフォーマットは人間が読むのが難しく、機械では解析が難しい。それはPDTまたはISTのような真のタイムゾーンではなく、標準化されておらず、ユニークではない(!)のような擬似タイムゾーンの3〜4文字の略語を使用します。例えば、America/Montreal,Africa/CasablancaまたはPacific/Aucklandのようなcontinent/regionのフォーマットのProper time zone nameである。

ISO 8601

日時の値をシリアル化するときにその代わりに、標準ISO 8601形式を使用しています。

java.timeクラスは、デフォルトで文字列の解析と生成時に標準ISO 8601の形式を使用します。

避けレガシー日時クラス

java.util.Dateは、Javaの最初のバージョンにバンドルされて面倒な下手に設計された紛らわしい古い日付時刻クラスの一つであることを知っています。これらのクラスは現在、古典的であり、java.timeクラスに取って代わりました。レガシークラスを避け、代わりにjava.timeを使用してください。

はjava.time

を使用DateTimeFormatterクラスは文字列を解析します。 Date::toStringの出力に一致する書式設定パターンを定義する必要があります。

String input = "Mon Apr 03 16:49:56 PDT 2017" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu", Locale.US) ; 

これで文字列をZonedDateTimeとして解析できます。

ZonedDateTime zdt = ZonedDateTime.parse (input, f) ; 

zdt.toString():2017-04-03T16:49:56から07:00 [アメリカ/ Los_Angeles】一般

の日付・時刻の値をシリアル化するためのベストプラクティスデータの格納と交換は、UTCで値を保持し、標準ISO 8601形式の文字列を作成することです。 ISO 8601のUTCの規則は、Zuluの略でUTCを意味するZを追加することです。

Instantクラスは、nanoseconds(小数点以下9桁まで)の解像度を持つUTCのタイムライン上の瞬間を表します。

Instant instant = zdt.toInstant() ; 
String output = instant.toString() ; 

instant.toString():2017-04-03T23:49:56Zは

JDBC

ご質問やコメントは明確ではありません。値が適切な日時型を使用してデータベースに格納されている場合は、上で説明したように文字列を混乱させる必要はありません。適切に格納されている場合は、必要に応じて変換しながら、JDBCドライバーにデータベース内外のデータをフェッチする作業をさせる必要があります。

JDBC 4.2以降に準拠するドライバは、PreparedStatement::setObjectおよびResultSet::getObjectでjava.time型を直接使用できます。


javaについて時間

java.timeフレームワークはJava 8以降に組み込まれています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6Java SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

+0

次回これを試してみます。 Groovy/GrailsはJava.util.Dateにデフォルト設定されているようですので、標準であると仮定しました。 Java.timeははるかに良く見えます。 –

+0

@DevonLuongo java.timeをレガシークラスと比較することは、[Yugo cars](https://en.m.wikipedia.org/wiki/Yugo)とHonda車を比較するようなものです。 –

+0

アップデート:残念ながら、GrailsはJava.timeとの互換性に問題があります。一時的な解決策がここに掲載されています:http://stackoverflow.com/questions/32974704/grails-3-and-java-8-time-support –

関連する問題