Joda Time toDate错误的结果

问题描述

我正在使用以下代码

date-来自DatePicker的日期对象,为字符串Thu 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

这怎么了?

解决方法

您没有将DateTime对象正确地转换为java.util.Date。正确的方法是从DateTime对象获取毫秒,并以毫秒初始化java.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

注意java.util.Date不代表日期/时间对象。它只是表示否。距1970-01-01T00:00:00Z的毫秒数。它没有任何时区或时区偏移信息。在打印时,Java将打印通过应用JVM的时区获得的字符串。如果要在其他时区进行打印,可以使用SimpleDateFormat进行打印,如上所示。

我建议您从过时且容易出错的java.util日期时间API和SimpleDateFormat切换到modern java.time日期时间API和相应的格式化API (软件包java.time.format)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。如果您的Android API级别仍不兼容Java8,请检查How to use ThreeTenABP in Android ProjectJava 8+ APIs available through desugaring

下表显示了overview of modern date-time classesenter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...