此代码:
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
如何从字符串创建日期,以便在同一时区将其与其余字段进行比较?
答案 0 :(得分:2)
Date
没有时区。让您感到困惑的是,Date.toString()
总是返回在系统默认时区中格式化的值,这也是Date.getTimeZoneOffset
所做的。
现在,在您的系统默认时区(中欧时间,从外观上看),UTC的偏移量在一年中会发生变化,时区缩写也是如此。这就是你所看到的:“中欧”时间(UTC + 1)和“中欧夏令时”之间的差异(UTC + 2)。这是当前系统时区中由您转换为字符串表示形式的Date
值表示的时刻的时区信息。
同样,Date
本身没有关于时区的信息。它只是 的一个时间点。您可以设置SimpleDateFormat
在解析或格式化时使用的时区 - 这是另一回事。
如果可能的话,你还应该考虑使用Joda Time - 它比Java内置的API要好得多。
答案 1 :(得分:1)
确定, 所以问题不是时区,而是来自
的转换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表示一个月中的一天
答案 2 :(得分:1)
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
另外,下面引用的是来自 home page of 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#isAfter
和 LocalDateTime#isBefore
来比较两个 LocalDateTime
。
从 Trail: Date Time 了解有关现代 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 desugaring 和 How to use ThreeTenABP in Android Project。