Java当前日期/时间比原始时间提前1小时显示

Java当前日期/时间比原始时间提前1小时显示,java,date,datetime,Java,Date,Datetime,当我尝试使用Calendar实例打印当前日期和时间时,得到的结果是比实际时间提前1小时 我在运行EST时区的远程机器上工作。下面是我尝试过的,但没有任何效果 Calendar cal = Calendar.getInstance(TimeZone.getDefault()); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST")); Calendar cal = Calendar.getInstance(Locale.EN

当我尝试使用Calendar实例打印当前日期和时间时,得到的结果是比实际时间提前1小时

我在运行EST时区的远程机器上工作。下面是我尝试过的,但没有任何效果

Calendar cal = Calendar.getInstance(TimeZone.getDefault());
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
Calendar cal = Calendar.getInstance(Locale.ENGLISH);

System.out.println("Current Date & Time: " +calendar.getTime());

o/p:
Time: Sat Dec 28 11:55:10 UTC 2013

But expected o/p: 
Time: Sat Dec 28 10:55:10 UTC 2013
所有3种类型都给出相同的结果。我不明白我错过了什么来得到确切的日期和时间。这个问题与夏令时有关吗


有人能帮我克服这个问题吗。提前感谢。

java.util.Date又是一个老陷阱:它的toString()方法在打印日历时间接使用。getTime()使用默认时区,而不是日历实例的时区(设置为“EST”)

解决方案:

Date currentTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("Current Date & Time: " + sdf.format(currentTime));
解释:

a) 在第一行中,不需要日历实例,因为您只对当前全局时间感兴趣(相同的物理时间,独立于时区)
Calendar.getInstance()
也会消耗更多的资源。最后,两个表达式
newdate()
Calendar.getInstance(…).getTime()
在有关内部状态时都没有时区引用。只有j.u.Date的
toString()
-方法使用默认时区

b) 您需要定义第2行中给出的输出格式。这取决于你去改变它。只需学习
java.text.simpleDataFormat
的模式文档

c) 您还需要在输出格式中定义时区,以帮助format对象将全局日期实例转换为时区感知表示。顺便说一句,我选择了标识符'America/New_York',而不是'EST',因为后者有时可能有歧义。您应该选择第一种形式(IANA或奥尔森时区标识符)或“GMT+/-HH:mm”形式

d) 输出本身是使用
sdf.format(currentTime)
完成的,而不仅仅是
currentTime
(没有隐式调用
toString()

e) 回答你的问题“这个问题与夏令时有关吗?”:不,时区EST(美国/纽约)的时间在12月份从来都不在DST

结论:

Date currentTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("Current Date & Time: " + sdf.format(currentTime));
如果可以的话,你应该尽量避免j.u.Date和j.u.Calendar,因为有太多的陷阱。目前,JodaTime是一个更好的选择,尽管不是没有问题。

避免使用三个字母的时区 切勿使用三个字母的时区代码。它们既不是标准化的,也不是独特的。您的“EST”至少可以表示以下内容:

  • 东部标准时间(美国)
  • 东部标准时间(澳大利亚)
  • 巴西东部标准时间
使用

避免j.u.日期/日历 您已经发现了避免使用java绑定的java.util.Date&java.util.Calendar类的众多原因之一:
Date
实例没有时区信息,但其
toString
方法会根据java环境的默认时区混淆地呈现字符串

利用乔达时间 使用合适的日期时间库。在Java中,这意味着新的Java.time.*类(灵感来源于Joda time),或者在Java8中是新的Java.time.*类

示例代码

//默认时区
DateTime DateTime_MyDefaultTimeZone=新日期时间();
//特定时区。若你们所说的“EST”是指美国东海岸,那个么就用一个像纽约这样的名字。
DateTimeZone timeZone=DateTimeZone.forID(“美国/纽约”);
DateTime DateTime_EastCoastUS=新的日期时间(时区);
转储到控制台

System.out.println(“dateTime\u MyDefaultTimeZone:+dateTime\u MyDefaultTimeZone”);
System.out.println(“dateTime\u eastcastus:+dateTime\u eastcastus”);
System.out.println(“UTC中的日期时间:+dateTime\u eastcastus.toDateTime(DateTimeZone.UTC));
当运行时

dateTime\u mydefault时区:2013-12-28818:51:18.485-08:00
东海岸日期时间:2013-12-28:21:51:18.522-05:00
UTC日期时间:2013-12-29T02:51:18.522Z
FYI“EST”在澳大利亚很少(且不正确)使用。我几乎总是看到它写着“AEST”(顺便说一句,我是澳大利亚人)