簡體   English   中英

SimpleDateFormat轉換為java.time

[英]SimpleDateFormat to java.time

我試圖了解Java 8日期/時間框架的工作原理。
我實際上是通過這種方式使用SimpleDateFormat返回給定字符串的毫秒數:

new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime();

Java 8中的新類會變成什么樣?

您指定的模式無法在Java-8中使用。 在Java-9中 ,似乎沒有反向移植已解決了該問題,但是Java-9尚未發布。

Java-8可能的解決方法包括笨拙的字符串預處理,即在小數部分前插入小數點分隔符或下載其他3rd-party-libraries(根據我的觀察,解析器可能仍比Java-9更快):

字符串預處理

String mydate = "20130812214600025";
String adjustedInput = new StringBuilder(mydate).insert(14, '.').toString();
ZonedDateTime date =
    ZonedDateTime.parse(
        adjustedInput,
        DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS").withZone(ZoneOffset.systemDefault()));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00[Europe/Berlin]
System.out.println(date.toInstant().toEpochMilli()); // 1376336760025

喬達時間

String mydate = "20130812214600025";
DateTime date =
    DateTime.parse(
        mydate,
        DateTimeFormat.forPattern("yyyyMMddHHmmssSSS"));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00
System.out.println(date.toInstant().getMillis()); // 1376336760025

我的圖書館Time4J

long millisSinceUnix =
    ChronoFormatter.ofPattern(
        "yyyyMMddHHmmssSSS",
        PatternType.CLDR,
        Locale.ROOT,
        Moment.axis(TemporalType.MILLIS_SINCE_UNIX)
    ).with(Timezone.ofSystem()).parse(mydate).longValue();
System.out.println(millisSinceUnix); // 1376336760025

供您參考:時區是必需的,因為我們將本地詳細信息(例如年,月,日,小時等)轉換為全局瞬間,但您的輸入內容不包含任何時區或偏移量信息。 因此,有必要為格式化程序提供區域或偏移量。

如您所見, SimpleDateFormat和Joda-Time默認(隱式)使用系統時區。 但是, java.time和Time4J要求顯式指定時區(IMHO更為簡潔的設計)。

您可以使用:

ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
System.out.println(date.toInstant().toEpochMilli());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM