java - 从毫秒返回 1970 年 1 月日期时损失了一个小时

标签 java date milliseconds date-formatting

我有以下代码,它采用毫秒字符串(将来自 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/

相关文章:

php - 根据频率计算一系列 future 日期的算法

java - 如何在不使用apache的情况下在java servlet中上传和保存文件?

java - Eclipse - 导入你自己的库

c# - SQL Bulkcopy YYYYMMDD问题

java - sqlite 将 Jdn 转换为 unixepoch

angularjs - 如何使用 Angularjs 将 View 日期绑定(bind)到模型毫秒

java - 想要阻止毫秒增加

java - 在 Java 中重写可变参数

java - react 堆项目 : ConnectableFlux auto-connecting on demand

iphone - 如何以编程方式构建本地化日历月份名称的 NSArray?