您没有正确地将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
日期时间 APISimpleDateFormat
切换到现代 java.time
日期时间 API 和相应的格式化 API(包,java.time.format
)。从Trail: Date Time了解有关现代日期时间 API 的更多信息。如果您的 Android API 级别仍然不兼容 Java8,请查看如何在 Android 项目中使用 ThreeTenABP和通过 deugaring 提供的 Java 8+ API。
下表显示了现代日期时间类的概述: