以下印度代码返回" 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);
}
答案 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)
The answer克劳德是对的。
最好使用Joda-Time库或Java 8中内置的类似java.time包。要么远远超过java.util.Date和.Calendar类的混乱。
在这两个库中,日期时间对象知道它自己指定的时区。如果未指定,则应用JVM的默认时区。最好指定所需的时区,而不是隐含地依赖默认值。
使用proper time zone names。避免使用既不标准也不唯一的普通3或4字母代码。
在下面的例子中,蒙特利尔比UTC晚了五个小时。
这是一个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