繁体   English   中英

Java 8 ZonedDateTime 格式日期

[英]Java 8 ZonedDateTime format date

我正在编写一个代码来获取英国夏令时的当前日期。 我坚持使用以下代码将日期转换为所需格式。

ZoneId zid = ZoneId.of("Europe/London");      
ZonedDateTime lt = ZonedDateTime.now(zid); 


// create a formatter
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
// apply format()
String value = lt.format(formatter);

System.out.println("value ="+value);

我将 output 的值设为 =2020-06-01+02:00,根据书面代码,这很好。 但我想要格式为01-JUN-20 的output

我应该使用什么格式化程序来实现这一点? 在 DST 和不在 DST 时,“欧洲/伦敦”也会给出正确的日期吗? 请帮助我解决以上两个问题。

tl;博士

ZonedDateTime
.now(
    ZoneId.of( "Europe/London" )
)
.format(
    DateTimeFormatter
    .ofPattern( "dd-MMM-uu" )
    .withLocale( Locale.UK )
)
.toUpperCase(
    Locale.UK
)

请参阅在 IdeOne.com 上实时运行的代码

01-JUN-20

细节

您问:

“欧洲/伦敦”会在 DST 和不在 DST 时给出正确的日期吗?

是的,您的代码是正确的。 ZonedDateTime.now ZoneId说明了挂钟时间的任何异常,包括夏令时 (DST)的异常。 结果是该地区的人们在查看各自墙上的日历和时钟时看到的日期和时间。

您可能会发现在UTC 中看到同一时刻很有趣或有用,它与 UTC的偏移量为零时分秒。 通过调用toInstant提取Instant object。

你说:

但我想要格式为 01-JUN-20 的 output

定义自定义格式模式以匹配您所需的 output。 实例化一个DateTimeFormatter object。

指定一个Locale object 以确定人类语言和文化规范在命名和缩写月份名称。

Locale locale = Locale.UK ;  // Or Locale.US, etc.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uu" ).withLocale( locale ) ;
String output = myZonedDateTime.format( f ) ;

我不知道如何在DateTimeFormatter格式模式中强制全部大写。 也许DateTimeFormatterBuilder可能会有所帮助; 我不知道。 作为一种解决方法,您可以简单地调用String.toUpperCase( Locale )

Locale locale = Locale.US ;  // Or Locale.UK, etc.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uu" ).withLocale( locale ) ;
String output = myZonedDateTime.format( f ).toUpperCase( locale ) ;

提示

  • 我建议你不要硬编码这样的格式。 通常最好让java.time通过调用DateTimeFormatter.ofLocalizedDateTime为您自动本地化。
  • 我进一步建议避免在年份中仅使用两位数字,因为这会使 output 更难阅读并产生歧义。 节省几个像素或碳粉颗粒并不能证明我在企业中看到的混乱是合理的。
  • 如果您的用户可以接受,请考虑使用标准ISO 8601日期格式:YYYY-MM-DD。 这种格式易于识别,易于心理处理(大中小细节),并且易于跨文化阅读。 生成/解析文本时, java.time类默认使用 ISO 8601 格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM