java - 如何以与记录区域格式相同的格式获取显示时间?

标签 java date

我有预计存储时区信息的日期格式:

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

日期值示例,

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

上述日期的区域常量是亚洲/加尔各答 (+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区的时间则应该显示在同一区的时间。

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

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

最佳答案

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);

此代码片段输出:

01/18/2019 07:00 AM

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

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

用法:亚洲/加尔各答是一个时区+05:30 是一个偏移量,它们不一样。例如,亚洲/科伦坡当前具有相同的偏移量,但仍被视为不同的时区。

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

关于java - 如何以与记录区域格式相同的格式获取显示时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54251224/

相关文章:

mysql - 如何在MySql中按日期顺序显示最近添加的数据?

c# - 这是众所周知的设计模式吗?它叫什么名字?

javascript - 使用加密库将 Java AES 加密转换为 Javascript

python - 从 Python (pandas) 的日期列中获取周开始日期(星期一)?

java - 如何在 Java 中健全地检查日期

Java 将 double 更改为 Date

java - 访问 cpu 寄存器

Java 手机 : Android or Blackberry?

java - 如何使用java制作一个空Mat?

php - 你如何解释 new\DateTime ('0000-00-00 00:00:00' ) 的结果?