【发布时间】:2019-06-15 13:57:56
【问题描述】:
我们正在将数据库日期转换为所需的用户时区。但是,如果我们以字符串格式使用 jodatime 进行格式化,我们将获得正确的日期,如果我们解析字符串以获取日期对象,我们将获得错误的时间。这是我的代码。我尝试了 jodatime 解析器和 java 日期
public class Test {
public static void main(String[] args) {
String dateF = "01/19/2019 at 07:35 PM (UTC)";
String dateFormat = "MM/dd/yyyy 'at' hh:mm a (zzz)";
long time = 1603305000;
String timeZone = "Etc/UTC";
Locale locale=new Locale("en", "US");
DateTimeFormatter dateFormatter = null;
if (locale.equals(Locale.FRENCH)) {
dateFormatter = DateTimeFormat.forPattern(dateFormat).withLocale(locale);
} else {
dateFormatter = DateTimeFormat.forPattern(dateFormat).withLocale(null);
}
if (true) {
dateFormatter = dateFormatter.withZone(DateTimeZone.forID(timeZone));
}
// Old Logic using Java Time
DateFormat format3 = new SimpleDateFormat(dateFormat, locale);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time);
if(true)
format3.setTimeZone(TimeZone.getTimeZone(timeZone));
DateTime jodatime = new DateTime(time);
try {
System.out.println(dateFormatter.print(jodatime));
System.out.println("timezone converted Date : " + format3.parse(dateFormatter.print(jodatime)));
System.out.println("dateFormatter.parseDateTime converted Date : " + dateFormatter.parseDateTime(dateFormatter.print(jodatime)).toDate());
} catch (Exception e) {
System.out.println(e);
}
}
}
格式化字符串01/19/1970 at 01:21 PM (UTC)中的正确日期
解析后我们得到了错误的结果
时区转换日期:Mon Jan 19 18:51:00 IST 1970
dateFormatter.parseDateTime 转换日期:Mon Jan 19 18:51:00 IST 1970
格式化日期中的正确日期:Mon Jan 19 01:21:00 UTC 1970
【问题讨论】:
-
您在使用 Joda-Time 时为什么要使用
SimpleDateFormat?为什么您使用已弃用的 Joda-Time,而不是 Java Time API? -
仅供参考,非常麻烦的旧日期时间类,例如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。 -
仅供参考,Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
-
根据Epoch Unix Time Stamp Converter Unix 时间 1603305000 相当于 10/21/2020 @ 6:30pm (UTC)。您确定要 1970 年 1 月 19 日下午 1:21 (UTC) 吗?
-
1 月 19 日星期一 18:51:00 IST 1970 与 1970 年 1 月 19 日下午 1:21 (UTC) 一致。如果我假设 IST 表示印度标准时间(它可以有其他含义)。两次您都在打印
java.util.Date对象,而Date对象没有时区,因此您不应期望将其转换为所需的用户时区。
标签: java datetime timezone jodatime