HH日期时间格式问题

时间:2018-04-12 21:43:13

标签: java linux unix calendar timestamp

需要帮助来确定问题的位置,无论是java问题还是linux框或其他内容。

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

我正在使用下面的代码片段来获取当前准备文件名的时间:

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

1 个答案:

答案 0 :(得分: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());

上述两个片段都会给出相同的结果,例如20180413-190318。在任何一种情况下,请填写我放置太平洋/诺福克所需的时区。