时区如何使用零(0L)的count-from-epoch影响新Date

时间:2015-01-07 12:21:12

标签: java

以下印度代码返回" 1970-01-01"对于0L而在加拿大,它返回" 1969-12-31"。我不知道这里出了什么问题,谁能告诉我这里有什么问题。我怀疑是因为时区问题,但需要更多信息。

public static RestEDate convertLongDateToStringDate(long lDate) {
    String returnDate = "";
    if (lDate >= 0) {
        returnDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date(lDate));
    }
    return new RestEDate(returnDate);
}

2 个答案:

答案 0 :(得分:5)

是的,这是一个时区问题。您的SimpleDateFormat实例默认为当前时区。 1970年1月1日午夜GMT(这是0L的意思)是1969年12月31日19:00在加拿大东海岸(GMT-0500)和1969年12月31日16:00在加拿大西海岸(格林尼治标准时间0800)。 Date实例是正确的,但解释的方式取决于格式化程序使用的时区。

要设置SimpleDateFormat使用的时区(例如,设置为GMT),请使用其setTimeZone方法(如果您已经拥有Calendar,则使用setCalendar使用)。

答案 1 :(得分:0)

T.J的

The answer克劳德是对的。

Joda-Time || java.time> java.util.Date

最好使用Joda-Time库或Java 8中内置的类似java.time包。要么远远超过java.util.Date和.Calendar类的混乱。

指定时区

在这两个库中,日期时间对象知道它自己指定的时区。如果未指定,则应用JVM的默认时区。最好指定所需的时区,而不是隐含地依赖默认值。

使用proper time zone names。避免使用既不标准也不唯一的普通3或4字母代码。

在下面的例子中,蒙特利尔比UTC晚了五个小时。

Joda-Time示例

这是一个Joda-Time 2.6示例。

DateTimeZone zoneMontreal = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeZeroInMontreal = new DateTime( 0L, zoneMontreal );
DateTime dateTimeZeroInUtc = dateTimeZeroInMontreal.withZone( DateTimeZone.UTC );  

跑步时。

dateTimeZeroInMontreal : 1969-12-31T19:00:00.000-05:00
dateTimeZeroInUtc : 1970-01-01T00:00:00.000Z