0

我需要一些帮助来将给定的本地日期时间值(或实用日期)转换为具有(ASIA/COLOMBO)时区的以下格式之一。以下是格式(来自单信号 API)。

“2015 年 9 月 24 日星期四 14:00:00 GMT-0700 (PDT)”

“2015 年 9 月 24 日,下午 2:00:00 UTC-07:00”

“2015-09-24 14:00:00 GMT-0700”

“2015 年 9 月 24 日 14:00:00 GMT-0700”

“2015 年 9 月 24 日星期四 14:00:00 GMT-0700(太平洋夏令时间)”

谢谢。

4

2 回答 2

4

ZonedDateTime

将日期、时间和区域实例化为ZonedDateTime对象。

LocalDate ld = LocalDate.of( 2015 , Month.SEPTEMBER , 24 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;
ZoneId z = ZoneId.of( "Asia/Colombo" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

如果给定一个java.util.Date对象,则转换为Instant.

Instant instant = myJavaUtilDate.toInstant() ;

应用区域以从 UTC 移动。

ZoneId z = ZoneId.of( "Asia/Colombo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

要生成所需格式的文本,请使用DateTimeFormatterclass. 这个问题已经在 Stack Overflow 上解决了很多次。因此,搜索该类名称以了解更多信息。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss OOOO" ) ;
String output = zdt.format( f ) ;

2015-09-24 14:00:00 GMT+05:30

ISO 8601

你展示的那些格式都是糟糕的选择。将日期时间值交换为文本时,请使用标准ISO 8601格式。标准格式旨在易于机器解析,并且易于跨文化的人类阅读。

java.time类在解析/生成字符串时默认使用 ISO 8601 格式。

于 2020-05-19T07:34:23.853 回答
1

java.time 类是在 1.8 中引入的,它允许更灵活和简洁的代码。

Instant now = Instant.now();
ZonedDateTime dateTime = now.atZone(ZoneId.of("Asia/Colombo"));
DateTimeFormatter format = DateTimeFormatter.ofPattern("E M d u HH:mm:ss OOOO (z)");

// Using a format to convert at Temporal to a string
String formattedDate = format.format(dateTime);

// Using a format to convert a string to a Instant
Instant parsedDate = Instant.from(format.parse(formattedDate));

您可以使用DateTimeFormatter.ofPatternDateTimeFormatter 中定义的众多常量之一来指定日期格式。我创建的模式与您的第一个示例相匹配。

老方法

这些类尚未被弃用,我发现对于简单的情况比现代方法更直接。

java.text.SimpleDateFormat;它可以处理往返于字符串和 java.util.Date 对象。

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss Z (z)");
format.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));
// Note that the current date and time will be used when instantiating a new Date object.
String formattedDate = format.format(new Date());

try {
    Date parsedDate = format.parse(formattedDate);
} catch (ParseException exception) {
    // Handle malformed date
}

您只需为您想使用的任何格式创建模式。

EEE MMM dd yyyy HH:mm:ss Z (z) = Thu Sep 24 2015 14:00:00 GMT-0700 (PDT)

于 2020-05-19T07:37:22.903 回答