提问人:Pavel Poley 提问时间:9/7/2020 最后编辑:Pavel Poley 更新时间:9/7/2020 访问量:686
Joda Time toDate() 错误结果
Joda Time toDate() wrong result
问:
我正在使用此代码:
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
这有什么问题?
答:
2赞
Arvind Kumar Avinash
9/7/2020
#1
您未正确将对象转换为对象。正确的方法是从对象中获取毫秒,然后用毫秒初始化。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
注意:不表示 Date/Time 对象。它只是表示否定。从 的纪元开始的毫秒数。它没有任何时区或区域偏移量信息。打印时,Java 会打印通过应用 JVM 的时区获得的字符串。如果要在其他时区打印,可以使用如上所示的时区进行打印。java.util.Date
1970-01-01T00:00:00Z
SimpleDateFormat
我建议您从过时且容易出错的日期时间 API 切换到现代日期时间 API 和相应的格式化 API(包、)。从 Trail: Date Time 了解有关新式日期时间 API 的更多信息。如果您的 Android API 级别仍然不符合 Java8,请查看如何在 Android 项目中使用 ThreeTenABP 和通过脱糖提供的 Java 8+ API。java.util
SimpleDateFormat
java.time
java.time.format
下表显示了新式日期时间类的概述:
评论
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,感谢您的帮助和时间。
评论
mDate
DatePicker