【问题标题】:Why Joda DateTime gives different result than Java Date?为什么 Joda DateTime 给出的结果与 Java Date 不同?
【发布时间】:2014-01-24 04:28:46
【问题描述】:

我使用 UTC 时区测试了 Joda DateTime 和 java.util.Date,我遇到了一个有趣的案例:

import org.joda.time.DateTime;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws ParseException {
        String dt = "2011-06-11T12:00:00Z";
        String format = "yyyy-MM-dd'T'hh:mm:ss'Z'";

        DateFormat df = new SimpleDateFormat(format);
        df.setTimeZone(TimeZone.getTimeZone("UTC"));

        Date d = df.parse(dt);
        DateTime joda = new DateTime(dt);

        // Output Sat Jun 11 05:00:00 PDT 2011
        System.out.println(joda.toDate());

        // Output Fri Jun 10 17:00:00 PDT 2011
        System.out.println(d);
    }
}

我想知道这对其中一个人来说是一个错误还是我在这里错过了一些重要的事情?

【问题讨论】:

  • 您仅将 UTC 时区设置为“d”变量,即 java.util.Date。也为 Joda DateTime "joda" 变量设置时区。
  • 顺便说一下,您的 DateTime 正在获取默认时区。如果您想要 UTC/GMT(或任何特定时区),请传递 DateTimeZone 对象。对于 UTC/GMT,有一个 predefined constant "UTC"。像这样:DateTime dateTime = new DateTime( "2011-06-11T12:00:00Z", DateTimeZone.UTC );

标签: java date datetime jodatime


【解决方案1】:

(编辑:更清晰、更正确的答案)

我相信这是因为 JODA 和 Java 日期格式对 12 小时演示文稿中的“12”的处理方式不同。其中一个将其视为午夜,而另一个将其视为中午。

将您的输入更改为2011-06-11T01:00:00Z 将证明我的假设。

这是因为,您正在使用 DateTime 的构造函数创建 JODA 时间,该构造函数又使用 ISO 格式解析您的字符串,该格式使用 24 小时格式:Default format used by JODA,而您用来构造 Java 日期的 DateFormat使用hh 作为小时字段,表示12 小时格式。因此他们对“12”的解释不同:12 小时制将其视为午夜,而 24 小时制将其视为中午。

最简单的更改是将格式更改为 yyyy-MM-dd'T'HH:mm:ss'Z' 使用 24 小时演示,然后它们都可以正常工作。

【讨论】:

猜你喜欢
  • 2022-01-25
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多