2017-10-25 10 views
3

私はマイクロ秒形式の時間文字列をZoneDateTimeに変換するために以下の関数を使用していますので、後ほど比較できます。異なる時間列の同じZonedDateTimeを受信

public static ZonedDateTime createTimeFromString(String inputTime) { 
    ZonedDateTime time; 
    try { 

     System.out.printf("Input time %s%n", inputTime); 
     DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS"); 
     LocalDate date = LocalDate.parse(inputTime, formatter); 
     time = date.atStartOfDay(ZoneId.systemDefault()); 

     System.out.printf("Formated time %s%n", time); 
     return time; 
    } 
    catch (DateTimeParseException exc) { 
     System.out.printf("%s is not parsable!%n", inputTime); 
     throw exc;  // Rethrow the exception. 
    } 
} 

しかし、私が関数に渡す文字列が何であれ、私は同じ出力を得ます。

例えば:私はあなたが私が間違ってやって明確にしてくださいすることができ

のJava 8を使用してい

Input time 20171025-10:58:24.062151 
Formated time 2017-10-25T00:00+05:30[Asia/Colombo] 

Input time 20171025-10:58:25.446862 
Formated time 2017-10-25T00:00+05:30[Asia/Colombo] 

答えて

3

LocalDate.parseに電話すると、日付部分(日、月、年)だけが残り、残りは破棄されます。 LocalDateには時刻フィールド(時、分、秒、秒数)がないため、単純に破棄して失われます。

atStartOfDay(ZoneId.systemDefault())を呼び出して、深夜の時刻をJVMのデフォルトタイムゾーンに設定します。

すべて(日付と時刻)を保持する場合は、すべての日付と時刻のフィールドを含むクラスであるLocalDateTimeに解析します。そして、あなたはZonedDateTimeに変換するatZoneメソッドを呼び出します。

String inputTime = "20171025-10:58:24.062151"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS"); 
// parse to a LocalDateTime (keeping all date and time fields) 
LocalDateTime date = LocalDateTime.parse(inputTime, formatter); 
// convert to ZonedDateTime 
ZonedDateTime z = date.atZone(ZoneId.systemDefault()); 

PS:それは常にそれが明示的にする方が良いですのでZoneId.systemDefault()は、JVMのデフォルトのタイムゾーンを返しますが、このcan be changed without notice, even at runtimeことに注意してくださいどちらを使用しているのですか?

IANA timezones namesのAPIは、Asia/ColomboまたはEurope/Berlinのように常にRegion/Cityの形式です。 ambiguous and not standardであるため、3文字の略語(ISTまたはCETなど)は使用しないでください。

ZoneId.getAvailableZoneIds()に電話すると、利用可能なタイムゾーンのリストを取得できます(システムに最適なタイムゾーンを選択できます)。次に、次のようにZoneId.of()メソッドをゾーン名で呼び出します。

// using specific timezone instead of JVM's default 
ZonedDateTime z = date.atZone(ZoneId.of("Asia/Colombo")); 
関連する問題