【问题标题】:why this date is created with a different timezone?为什么这个日期是用不同的时区创建的?
【发布时间】:2012-07-04 11:52:58
【问题描述】:

这段代码:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD_HH-mm-ss");
Date date=null;
try {
  date = format.parse("2012-07-04_13-42-03");
} catch (Exception e) {
}
File file = new File("File.txt");
Date now=new Date();
Date last= new Date(file.lastModified());
System.out.println("exec:"+date+" "+date.getTime()+" "+date.getTimezoneOffset());
System.out.println(" now:"+now+" "+now.getTime()+" "+now.getTimezoneOffset());
System.out.println("last:"+last+" "+last.getTime()+" "+last.getTimezoneOffset());

给出结果:

exec:Wed Jan 04 13:42:03 CET 2012 1325680923000 -60
 now:Wed Jul 04 13:42:20 CEST 2012 1341402140349 -120
last:Mon Jul 02 17:26:37 CEST 2012 1341242797000 -120

如何根据字符串创建日期,以便在同一时区将其与其他日期进行比较?

【问题讨论】:

  • 代码和输出对吗?好像顺序不同,加上last和exec调用相同的代码(date.getTime())却返回不同的结果?
  • 我从另一个地方接了订单,它打印了多个日期。
  • 是不同代码的recop,抱歉。已编辑问题。
  • 顺便说一句,您应该使用dd 而不是DDSimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
  • 谢谢,刚刚发现,然后阅读您的评论...

标签: java date timezone format


【解决方案1】:

Date 没有时区。让您感到困惑的是 Date.toString() 总是 返回一个以系统默认时区格式格式化的值,而 Date.getTimeZoneOffset 也是这样做的。

现在,在您的系统默认时区(看起来是中欧时间)中,与 UTC 的偏移量在一年中会发生变化,时区缩写也是如此。这就是您所看到的:“中欧”时间 (UTC+1) 和“中欧夏令时”) (UTC+2) 之间的差异。这是您要转换为字符串表示形式的Date 值表示的当前系统时区中的时区信息。

同样,Date 本身没有关于时区的信息。 只是一个时间点。您可以设置 SimpleDateFormat 在解析或格式化时使用的时区 - 这是另一回事。

如果可能的话,您还应该考虑使用 Joda Time - 它比 Java 内置的 API 要好得多。

【讨论】:

【解决方案2】:

好的, 所以问题不在于时区,而是来自

的转换
2012-07-04_13-42-03

Wed Jan 04 13:42:03 CET 2012

问题在于格式模式如此变化

yyyy-MM-DD_HH-mm-ss

yyyy-MM-dd_HH-mm-ss

因为 D 表示一年中的一天,而 d 表示一个月中的一天

【讨论】:

    【解决方案3】:

    java.time

    java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

    另外,下面引用的是来自home page of Joda-Time的通知:

    请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

    使用现代日期时间 API java.time 的解决方案:

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            String strDateTime = "2012-07-04_13-42-03";
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d_H-m-s", Locale.ENGLISH);
            LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);
            System.out.println(ldt);
        }
    }
    

    输出:

    2012-07-04T13:42:03
    

    ONLINE DEMO

    如何比较两个LocalDateTimes:

    您可以使用LocalDateTime#isAfterLocalDateTime#isBefore 来比较两个LocalDateTimes。

    Trail: Date Time 了解有关现代日期时间 API 的更多信息。

    您的代码出了什么问题?

    您使用了D,其中specifies Day in year,而您需要d,它指定月份中的日期。由于您要比较同一时区中的所有日期时间,在这种情况下,时区没有问题


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2015-10-14
      • 2016-06-03
      • 1970-01-01
      • 2020-12-27
      • 2019-07-23
      相关资源
      最近更新 更多