日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

instant java,关于java:Format Instant to String

發布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 instant java,关于java:Format Instant to String 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在嘗試使用新的java 8 time-api和模式將Instant格式化為String:

Instant instant = ...;

String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);

使用上面的代碼我得到一個異常,它抱怨一個不受支持的字段:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra

at java.time.Instant.getLong(Instant.java:608)

at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)

...

時區

要格式化Instant,需要時區。如果沒有時區,格式化程序將不知道如何將即時字段轉換為人類日期時間字段,因此會拋出異常。

可以使用withZone()將時區直接添加到格式化程序中。

DateTimeFormatter formatter =

DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )

.withLocale( Locale.UK )

.withZone( ZoneId.systemDefault() );

生成字符串

現在使用該格式化程序生成Instant的String表示形式。

Instant instant = Instant.now();

String output = formatter.format( instant );

轉儲到控制臺。

System.out.println("formatter:" + formatter +" with zone:" + formatter.getZone() +" and Locale:" + formatter.getLocale() );

System.out.println("instant:" + instant );

System.out.println("output:" + output );

跑步時

formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB

instant: 2015-06-02T21:34:33.616Z

output: 02/06/15 14:34

謝謝!! BTW例外的"不支持的字段"指向例如年,是非常鈍的。也許應該檢測到這種情況,并且應該拋出直接指向Instant中缺少的區域id的異常!

更奇怪的是,如果你包括.withZone(例如.withZone(ZoneId.of("Z")))并格式化LocalDateTime,那么該區域就是IGNORED!因此,只要包含.withZone(),就可以對Instant和LocalDateTime使用相同的格式化程序,而不會影響后者顯示的時間。

為什么接受Instant有一個GMT的TimeZone是如此困難?

public static void main(String[] args) {

DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

.withZone(ZoneId.systemDefault());

System.out.println(DATE_TIME_FORMATTER.format(new Date().toInstant()));

}

雖然此代碼可能會回答這個問題,但提供有關如何以及為何解決問題的其他背景將提高答案的長期價值。

雖然此代碼段可以解決問題,但包括解釋確實有助于提高帖子的質量。請記住,您將來會回答讀者的問題,而這些人可能不知道您的代碼建議的原因。

Instant類不包含區域信息,它僅存儲UNIX紀元的時間戳(以毫秒為單位),即UTC的1月1日1070。

因此,格式化程序無法打印日期,因為日期始終打印為具體時區。

您應該將時區設置為格式化程序,一切都會好的,如下所示:

Instant instant = Instant.ofEpochMilli(92554380000L);

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC);

assert formatter.format(instant).equals("07/12/72 05:33");

assert instant.toString().equals("1972-12-07T05:33:00Z");

DateTimeFormatter.ISO_INSTANT.format(Instant.now())

這樣您就不必轉換為UTC。但是,其他一些語言的時間框架可能不支持毫秒,所以你應該這樣做

DateTimeFormatter.ISO_INSTANT.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))

你是什??么意思"其他語言的時間框架"? ISO_INSTANT.format()會自動截斷為秒嗎?

有些框架只希望時間達到秒,因為它們不遵循完整的ISO約定,并且當輸入字符串的一部分有毫秒時就會中斷。

或者,如果您仍想使用從模式創建的格式化程序

你可以使用LocalDateTime而不是Instant:

LocalDateTime datetime = LocalDateTime.now();

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(datetime)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");

String text = date.toString(formatter);

LocalDate date = LocalDate.parse(text, formatter);

我相信這可能會有所幫助,您可能需要使用某種localdate變體而不是即時變體

總結

以上是生活随笔為你收集整理的instant java,关于java:Format Instant to String的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。