问题描述
我正在使用以下代码:
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 Project和Java 8+ APIs available through desugaring。