2012-03-02 27 views
0

日付文字列(木曜日、1 Mar 2012 13:57:06 -0600)をDate変数に変換する関数を書いています。 私は変換のためにSimpleDateFormatに頼っています。変換は行われますが、結果の日付は "Thu Sep 01 11:00:06 GMT-08:00 2016"です。これはわかりません。私はフォーマット文字列に対して依然として異なるオプションを試しました。どんな助けもありがたい。ありがとうございました。Java:タイムゾーン変数で日付を文字列に変換する

I書式文字列を試みたオプションがある:MM: 1)E、MMMのYYYYのHH ddはMM:SSのZZZZ

private Date Convert_To_Date() { 

     Date dt = null; 

     String str = "Thu, 1 Mar 2012 13:57:06 -0600"; 
     SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:MM:ss Z"); 

     try { 
      dt = formatter.parse(str); 
     } 
     catch (ParseException pe) { 
      System.out.println(pe.getMessage()); 
     } 

     //String strDt = dt.toString(); 
     System.out.println(dt); 

     return dt; 
    } 

答えて

3

SS Z 2)EEEを、MMMのYYYYのHHをddは問題はあなたが "m"の代わりに "M"を数分間使っていたことだけだったと思います。これは私のために正常に動作します:

import java.text.*; 
import java.util.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     String text = "Thu, 1 Mar 2012 13:57:06 -0600"; 
     // Note the explicit locale. Let's not leave it as the system default :) 
     DateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", 
                Locale.US); 

     Date dt = formatter.parse(text); 
     System.out.println(dt); 
    } 
} 

(sgmorrisonで述べたように、あなたもdの代わりddを使用することができ、そしてそれはあなたのフォーマットのより正確な記述になります - しかし、この場合に解析するためのdd作品。)

2

あなたの日付書式文字列の中の小さなバグのカップル:時間内の一致分間

あなたのパターンは「ミリメートル」、ではない(年の月に一致する)「MM」でなければなりません。詳細は、SimpleDateFormatを参照してください。

また、パターン文字の数が最小桁数であり、短い数字がこの量にゼロ詰めされているため、月の一致日のパターンは「d」ではなく「d」でなければなりません。解析のために、隣接する2つのフィールドを区切る必要がないかぎり、パターン文字の数は無視されます。

0

TL; DR

ZonedDateTime.parse( 
    "Thu, 1 Mar 2012 13:57:06 -0600" , // Input complies with RFC 1123 & RFC 822. 
    DateTimeFormatter.RFC_1123_DATE_TIME // Hard-coded to English locale. 
).toString() 

2012-03-01T13:57:06-06:00

java.time

現代的なアプローチはのJavaを使用しています。時間がで、厄介な古いレガシー日時クラスに取って代わるクラスです。

RFC 1123/RFC 822

あなたの入力文字列がRFC 1123/RFC 822を遵守することが起こります。 java.time.DateTimeFormatterクラスは、その形式の定数をDateTimeFormatter.RFC_1123_DATE_TIMEと定義しています。

String input = "Thu, 1 Mar 2012 13:57:06 -0600" ; 
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ; 
ZonedDateTime zdt = ZonedDateTime.parse(input , f) ; 

2012-03-01T13:57:06-06:00

これらのRFCは古いです。この形式は現在ISO 8601標準よりも時代遅れです。古いフォーマットはひどいものです:英語を想定し、幅広いコンテンツを許容し、解析が難しいです。

今日のほとんどのプロトコルおよび標準では、日付時刻の値をテキストとして交換するために、ISO 8601形式が使用されています。この規格で定義されているフォーマットは実用的で文化間でも曖昧ではなく、機械で簡単に解析でき、デバッグ/ロギングのために人間が読みやすい。

java.timeクラスでは、上記の例のように、文字列の解析/生成時にデフォルトでISO 8601形式が使用されます。


についてjava.time

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

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

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

以降に準拠している場合は、java.timeオブジェクトをデータベースと直接交換することができます。文字列やjava.sql。*クラスは必要ありません。

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

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

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

関連する問題