如何获得与记录区域格式相同的显示时间?

时间:2019-01-18 09:42:08

标签: java date

我的日期格式应该存储时区信息:

SimpleDateFormat dateWithZoneFormat
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

日期值示例

2019-01-18T07:00:00.000+0530

上述日期的区域常数为Asia / Calcutta(+0530),Reference.

现在在不同时区的机器上显示时,我希望上述日期显示与上述日期相同的时区,即+530,这不是恒定的时区,可以根据用户所在的国家/地区进行更改。

我在Java中的显示代码如下:

SimpleDateFormat dateWithZoneFormat
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat displayDateFormat
            = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
Date date = DateUtils.getZoneDate("2019-01-18T07:00:00.000+0530");
                    String displayDate = DateUtils.displayDateFormat.format(date);
                    displayTag = displayDate + " " + displayTag;

上面的代码有问题,它会在创建显示时间时选择运行计算机的默认区域。

简单来说,如果在显示时在+0530区域中记录的时间应该在+0530区域中显示显示时间,如果在+0100区域中记录的时间应该在相同的区域时间中显示。

我该如何以记录时的相同区域格式显示上述日期,而不是显示该日期的日期(即不在计算机默认时区)。

有什么办法可以提取上述日期字符串中的区域信息?

1 个答案:

答案 0 :(得分:2)

java.time的OffsetDateTime

    DateTimeFormatter recordedFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
    DateTimeFormatter displayFormatter
            = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.ENGLISH);

    OffsetDateTime dateTime = OffsetDateTime.parse("2019-01-18T07:00:00.000+0530", recordedFormatter);
    String displayDateTime = dateTime.format(displayFormatter);
    System.out.println(displayDateTime);

此代码段输出:

  

2019/01/18上午07:00

记录的字符串中的时间将保留。时间以相同的UTC偏移量显示。

与老式Date相反,OffsetDateTime具有UTC偏移量,因此在解析和格式化时保持一天中的同一时间。

用法:亚洲/ Calcutta是一个时区+05:30是一个偏移量,它们并不相同。例如,亚洲/科伦坡目前处于相同的偏移时间,但仍被视为不同的时区。

链接: Oracle tutorial: Date Time解释了如何使用java.time