我有一個 LocalDateTime 物件,我正在格式化如下:
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(localDateTime.format(formatter));
這會列印一個可讀性很好的日期Oct 20, 2021 1:00:02 PM.
但我還想顯示時區。我的理解是我需要使用 ZonedDateTime:
ZonedDateTime zdt = localDateTime.atZone(ZoneId.of("America/New_York"));
System.out.println(zdt);
但這會產生不那么可讀的2021-10-20T13:05:13.921-04:00[America/New_York].
是否有某種方式來格式化ZonedDateTime,所以它讀取類似,所產生FormatStyle.MEDIUM,而是由時區附加-比方說,是這樣的:Oct 20, 2021 4:05:13 PM EST?
我認為,從這個答案中,我應該避免使用“偽區域”,例如EST,因為它們具有非標準化的性質(盡管無論是否標準,我都敢說這是大多數用戶習慣的)。因此,如果EST等在 Java 庫中不可行,我仍然希望生成由 生成的可讀日期FormatStyle.MEDIUM,然后是一些時區表示。
那可能嗎?
uj5u.com熱心網友回復:
ZonedDateTime 可以檢索當前的 ZoneId。使用 Zone,你可以只使用getDisplayName(TextStyle style, Locale locale)getter。只需嘗試哪種 TextStyle 最適合您。
zdt.getZone().getDisplayName(TextStyle.SHORT, Locale.ENGLISH)
==> ET
uj5u.com熱心網友回復:
請注意,如果您使用LONG或FULL時間樣式,則將包括區域:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("America/New_York"));
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.LONG);
System.out.println(zdt.format(formatter));
在美國語言環境中,這會列印:
Oct 20, 2021, 4:34:16 PM EDT
這是記錄在這里:
該
FULL和LONG風格通常需要一個時區。使用這些樣式進行格式化時,ZoneId 必須可用,通過使用ZonedDateTime或withZone(java.time.ZoneId)。
在這種情況下,時間樣式LONG恰好與 相同MEDIUM,但如果您MEDIUM出于某種原因必須使用,您可以使用 aDateTimeFormatterBuilder并手動添加區域:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("America/New_York"));
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM))
.appendLiteral(" ")
.appendZoneText(TextStyle.SHORT).toFormatter();
System.out.println(zdt.format(formatter));
這樣做的好處是您可以選擇您想要的時區名稱樣式。另一方面,您可能會遇到本地化問題,因為我不確定是否在所有語言環境中都將時區放在最后。
uj5u.com熱心網友回復:
tl;博士
如果您想了解正在使用的時區,請使用LONG時間部分的格式。(可選)指定不同的格式,例如MEDIUM日期部分。
ZonedDateTime
.now( ZoneId.of( "America/New_York" ) )
.format(
DateTimeFormatter
.ofLocalizedDateTime(
FormatStyle.MEDIUM , // Date portion style.
FormatStyle.LONG // Time-of-day portion style.
)
.withLocale( Locale.US ) // Locale determines the human language and cultural norms used in localizing.
)
查看此代碼在 IdeOne.com 上實時運行。
2021 年 10 月 20 日,美國東部時間下午 4:48:46
切勿將EDT、CST、IST等用于資料交換。這些不是實時時區,不是標準化的,甚至不是唯一的!
避免 LocalDateTime.now
我無法想象任何情況下打電話LocalDateTime.now是正確的事情。您捕獲日期和時間,但缺少時區或 UTC 偏移量的背景關系。所以 aLocalDateTime根據定義不能代表一個時刻,不是時間線上的一個點。
如果您想在不提交特定時區的情況下捕獲當前時刻,請捕獲當前時刻,從 UTC 的偏移量為零時-分-秒。
Instant instant = Instant.now() ; // Current moment as seen in UTC.
用 ZonedDateTime.now
如果您想捕捉在America/New_York時區中看到的當前時刻,請以ZonedDateTime.
ZonedDateTime.now( ZoneId.of( "America/New_York" ) )
要生成表示java.time物件的文本,請使用toString方法以標準ISO 8601格式獲取文本。雖然這種輸出乍一看似乎不太可讀,但標準格式的設計目的是讓不同文化的人都能最大限度地閱讀。
要獲得本地化格式,我建議您讓java.time自動本地化。
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ZonedDateTime.now( z );
System.out.println( "zdt represented in standard ISO 8601 format: " zdt.toString() );
Locale locale = Locale.US ;
DateTimeFormatter f_US = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale ) ;
String outputLocalized_US = zdt.format( f_US ) ;
String outputLocalized_CA_fr = zdt.format( f_US.withLocale( Locale.CANADA_FRENCH ) ) ;
System.out.println( outputLocalized_US ) ;
System.out.println( outputLocalized_CA_fr ) ;
跑的時候。
zdt represented in standard ISO 8601 format: 2021-10-20T16:37:57.752554-04:00[America/New_York]
Oct 20, 2021, 4:37:57 PM
20 oct. 2021 16 h 37 min 57 s
日期和時間的單獨格式
您可以為日期和時間部分指定不同的格式。如果您愿意,可以對時間部分使用較長的格式以獲取時區提示,而對日期部分使用較短的格式。
DateTimeFormatter
.ofLocalizedDateTime(
FormatStyle.MEDIUM , // Date portion format.
FormatStyle.LONG // Time-of-day portion format.
)
uj5u.com熱心網友回復:
是否有某種方式來格式化ZonedDateTime,所以它讀取類似,所產生
FormatStyle.MEDIUM,而是由時區附加-比方說,是這樣的:Oct 20, 2021 4:05:13 PM EST?
您可以使用MMM d, uuuu h:mm:ss a zzz帶有DateTimeFormatter.
演示:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d, uuuu h:mm:ss a zzz", Locale.ENGLISH);
System.out.println(now.format(dtf));
}
}
輸出:
Oct 20, 2021 6:41:45 PM EDT
ONLINE DEMO
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327925.html
