为什么使用不同的时区创建此日期



此代码:

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

如何从字符串创建日期,以便将其与同一时区的其余日期进行比较?

Date没有

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

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

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

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

好的,所以问题不在于时区,而在于从

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 表示月份中的一天

java.time

java.util日期时间 API 及其格式设置 API SimpleDateFormat已过时且容易出错。建议完全停止使用它们,并切换到现代日期-时间 API*

另外,下面引用的是Joda-Time主页上的通知:

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

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

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

在线演示

如何比较两个LocalDateTime

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

要了解有关现代日期-时间 API 的更多信息,请参阅跟踪:日期时间

你的代码出了什么问题?

您已经使用了指定一年中的一天D而您需要d指定月份中的一天。由于您正在比较同一时区中的所有日期时间,因此在这种情况下,时区没有问题

<小时 />

出于任何原因,如果你必须坚持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到Java 6和7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API 和如何在 Android Project 中使用 ThreeTenABP。

相关内容

  • 没有找到相关文章

最新更新