Joda Time toDate() 错误结果

Joda Time toDate() wrong result

提问人:Pavel Poley 提问时间:9/7/2020 最后编辑:Pavel Poley 更新时间:9/7/2020 访问量:686

问:

我正在使用此代码:

date- 来自 的日期对象,作为字符串DatePickerThu Sep 10 00:00:00 GMT+03:00 2020

mDate = DateTime(date)
           .withHourOfDay(0)
           .withMinuteOfHour(0)
           .withSecondOfMinute(0)
           .withMillisOfSecond(0)
           .toDate()

结果mDate - Wed Sep 09 03:00:00 GMT+03:00 2020

这有什么问题?

java android 日期时间 jodatime android-jodatime

评论

0赞 Pavel Poley 9/7/2020
为什么它是正确的?没有时区的util.date和带时区的joda时间?
0赞 Arvind Kumar Avinash 9/7/2020
Pavel Poley - 你的转换是错误的,我已经在我的回答中解释过了。除非你告诉我你到底无法理解什么,否则我怎么能进一步帮助你?由于您的转换错误,表示与 .mDateDatePicker

答:

2赞 Arvind Kumar Avinash 9/7/2020 #1

您未正确将对象转换为对象。正确的方法是从对象中获取毫秒,然后用毫秒初始化。DateTimejava.util.DateDateTimejava.util.Date

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Define formatter
        DateTimeFormatter formatter = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zZ yyyy");

        // Date-time string from DatePicker
        String strDateTime = "Thu Sep 10 00:00:00 GMT+03:00 2020";

        DateTime dateTime = DateTime.parse(strDateTime, formatter);
        System.out.println(dateTime);

        // No. of milliseconds from the epoch of 1970-01-01T00:00:00Z 
        long millis = dateTime.getMillis();
        System.out.println(millis);

        Date mDate = new Date(millis);
        // Display java.util.Date object in my default time-zone (BST)
        System.out.println(mDate);

        //Display java.util.Date in a different time-zone and using custom format
        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+3"));
        System.out.println(sdf.format(mDate));
    }
}

输出:

2020-09-09T21:00:00.000Z
1599685200000
Wed Sep 09 22:00:00 BST 2020
Thu Sep 10 00:00:00 GMT+03:00 2020

注意:不表示 Date/Time 对象。它只是表示否定。从 的纪元开始的毫秒数。它没有任何时区或区域偏移量信息。打印时,Java 会打印通过应用 JVM 的时区获得的字符串。如果要在其他时区打印,可以使用如上所示的时区进行打印。java.util.Date1970-01-01T00:00:00ZSimpleDateFormat

我建议您从过时且容易出错的日期时间 API 切换到现代日期时间 API 和相应的格式化 API(包、)。从 Trail: Date Time 了解有关新式日期时间 API 的更多信息。如果您的 Android API 级别仍然不符合 Java8,请查看如何在 Android 项目中使用 ThreeTenABP通过脱糖提供的 Java 8+ APIjava.utilSimpleDateFormatjava.timejava.time.format

下表显示了新式日期时间类的概述enter image description here

评论

0赞 Pavel Poley 9/7/2020
新的 Java api 包含 ?time-zone or zone-offset information
1赞 Arvind Kumar Avinash 9/7/2020
@PavelPoley - 是的,我在上次回答中已经表明了这一点。我为您提供了您应该探索的相关链接。如果您希望我发布更多代码,请随时告诉我。
0赞 Joachim Sauer 9/7/2020
虽然我全心全意地赞成切换到它,但不幸的是,自 API 级别 26(Android O,8.0)以来,它只包含在 Android 中,许多人仍然以这样的较低级别为目标,因此无法在 Android 上使用它。像 joda-time 或 threetenbp 这样的东西是他们最好的选择。java.time
2赞 Anonymous 9/8/2020
@JoachimSauer Joda-Time 也不包含在 Android 中。无论如何,我们都需要添加一个外部依赖项。因此,我们不妨选择 java.time 的向后移植,即 ThreeTenABP
1赞 Pavel Poley 9/8/2020
@Arvind 库马尔·阿维纳什 我迁移到 Java 时间 api,以执行所有计算(DAYS.between 和 plusDays()),现在可以正常工作,但支持旧的 util.date,感谢您的帮助和时间。