【问题标题】:Issue with HH date time formatHH 日期时间格式问题
【发布时间】:2018-09-23 04:24:00
【问题描述】:

需要帮助确定问题出在哪里,是 java 问题还是 linux 机器或其他问题。

我的应用程序在 linux weblogic 上运行,应用程序正在 linux 上生成某种 .tar 文件,文件名中带有 datetimestamp。

我正在使用下面的 sn-p 来获取当前准备文件名的时间:

String dateTimeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(Calendar.getInstance().getTime());

文件格式:SA_PART_YYYYMMDD-HHMMSS_sequence.tar

以下是来自 linux box 的文件:如果你仔细观察,HH(小时)部分在 13 到 12 到 13 到 12 到 14 到 13 之间切换。分钟和秒之间没有大的区别。

我需要了解为什么 HH 在这里打印错误?

-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:45 SA_PART_20180412-134347_6000010739.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:45 SA_PART_20180412-134351_6000010740.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:45 SA_PART_20180412-124355_6000010741.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:45 SA_PART_20180412-124357_6000010742.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:47 SA_PART_20180412-134523_6000010743.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:47 SA_PART_20180412-134526_6000010744.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:47 SA_PART_20180412-124531_6000010745.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 17:47 SA_PART_20180412-124531_6000010746.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 18:17 SA_PART_20180412-141524_6000010747.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 18:17 SA_PART_20180412-141528_6000010748.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 18:17 SA_PART_20180412-131531_6000010749.tar
-rw-rw-rw- 1 med1 temp1 20480 Apr 12 18:17 SA_PART_20180412-131533_6000010750.tar

【问题讨论】:

  • 您传递给SimpleDateFormat 的实际Date 值是多少?
  • 它的 Calendar.getInstance().getTime() -> 获取当前系统日期和时间
  • 是的,我明白这一点,但是传递给SimpleDateFormat 的“实际”值是多少。如果您不知道输入是什么,就没有必要抱怨输出
  • 我没有实际值,但我在这里知道的是 - 输入是当前系统日期和时间,将由 Calendar.getInstance().getTime() 返回,输出相同.
  • 快速更新:问题是 cluser linux 盒子之一指向错误的时区,因此小时部分的差异。问题解决无需采取任何行动。谢谢

标签: java linux unix calendar timestamp


【解决方案1】:

很可能是时区问题。 new SimpleDateFormat("yyyyMMdd-HHmmss") 创建一个使用 JVM 时区设置的 SimpleDateFormat。可以随时从程序的其他部分以及在同一 JVM 中运行的其他程序更改此设置。所以它很脆弱。例如,假设您的程序的两个不同部分需要设置设置并进行不同的设置。这可以解释。

解决方案是给出一个明确的时区。现代方式:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss");
        String dateTimeStamp = LocalDateTime.now(ZoneId.of("Pacific/Norfolk")).format(formatter);

或者,如果您还不想离开早已过时且臭名昭著的 SimpleDateFormat 课程:

        DateFormat format = new SimpleDateFormat("yyyyMMdd-HHmmss");
        format.setTimeZone(TimeZone.getTimeZone("Pacific/Norfolk"));
        String dateTimeStamp = format.format(System.currentTimeMillis());

上述两个 sn-ps 给出相同的结果,例如20180413-190318。无论哪种情况,请填写您希望的太平洋/诺福克时区。

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多