我有以下代码,它采用毫秒字符串(将来自 RSS 提要,因此将是一个字符串,下面的示例是一个快速测试程序)并将这些毫秒转换为日期对象。
public static void main(String[] args) {
String ms = "1302805253";
SimpleDateFormat dateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(ms));
try {
String dateFormat = dateFormatter.format(calendar.getTime());
System.out.println("Date Format = " + dateFormat);
Date dateParse = dateFormatter.parse(dateFormatter.format(calendar.getTime()));
System.out.println("Date Parse = " + dateParse);
} catch (ParseException e) {
// TODO: handle exception
}
}
Output:
Date Format = Fri, 16 Jan 1970 02:53:25 GMT
Date Parse = Fri Jan 16 03:53:25 GMT 1970
如您所见,在格式化日历对象和解析结果字符串之间,损失了一个小时。此外,输出的格式也发生了变化。任何人都可以帮助我了解为什么会发生这种情况,以及如何解决它?我希望日期对象的格式与“日期格式”输出的格式相同。
最佳答案
我相信它正在发生,因为英国在 1970 年实际上没有使用 GMT,而 Java 有一个错误...它将格式化 1970 年的日期就好像英国使用的是格林威治标准时间,但实际上并没有改变偏移量。简单示例:
Date date = new Date(0);
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz");
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
结果:
01 Jan 1970 01:00:00 GMT
请注意,它声称现在是格林威治标准时间凌晨 1 点...这是不正确的。 欧洲/伦敦时间凌晨 1 点,但欧洲/伦敦不遵守 GMT。
Joda Time这样做是正确的,因为它打印出 BST - 但 Joda Time 不喜欢解析带有时区缩写的值。但是,您可以让它使用时区 offets 代替:
import org.joda.time.*;
import org.joda.time.format.*;
public class Test {
public static void main(String[] args) throws Exception {
DateTime date = new DateTime(0, DateTimeZone.forID("Europe/London"));
DateTimeFormatter formatter = DateTimeFormat.forPattern(
"dd MMM yyyy HH:mm:ss Z");
String text = formatter.print(date); // 01 Jan 1970 01:00:00 +0100
System.out.println(text);
DateTime parsed = formatter.parseDateTime(text);
System.out.println(parsed.equals(date)); // true
}
}
关于java - 从毫秒返回 1970 年 1 月日期时损失了一个小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816510/