在我的应用程序中,它保存了一个偏好,它是一个整数,即自纪元以来的天数。 (不相关,但每隔x天用于创建备份)
鉴于此值,我如何可靠地创建joda DateTime
的实例?
我很想通过乘法value * 24 * 60 * 60 * 1000
将其转换为毫秒,但由于天文/太阳时间,这会是错误的吗?
答案 0 :(得分:2)
如果使用库函数,则将天数乘以毫秒数可能会更具可读性。我强烈推荐使用Joda。 :)
你的纪元(GMT)有很多天,你想要一个DateTime(日期+时间+时区)。至少在进一步开始之前,您需要指定您希望如何处理时间和时区计算。
最简单的方法(可能不是你想要的)是在本地时区创建代表纪元开始的瞬间,然后使用plusDays
添加正确的天数:
// in class - note that this will cache the current default timezone
private static final DateTime EPOCH_START_INSTANT = new DateTime(0);
// West of Greenwich, this will actually represent the "day" before.
// Day 0 will be Dec 31, 1969, local time.
DateTime localTime = EPOCH_START_INSTANT.plusDays(yourDayCount);
为了每隔X天创建一次备份,您可能希望在纪元(1970年1月1日)初始化LocalDate,加上您想要的天数。然后可以相对容易地将其更改为指定的当地时间。
// in class
private static final EPOCH_LOCALDATE = new LocalDate(1970, 1, 1);
private static final THREE_AM = new LocalTime(3, 0);
LocalDate localDate = EPOCH_LOCALDATE.plusDays(yourDayCount);
// Midnight (or closest valid time thereto) in the default time zone
DateTime startOfDay = localDate.toDateTimeAtStartOfDay();
// 3 AM in the default time zone
DateTime threeAM = localDate.toDateTime(THREE_AM);
答案 1 :(得分:2)
杰夫鲍曼的answer是正确的。
我将在java.time框架中展示相同的想法,旨在接替Joda-Time。
Java 8及更高版本内置了新的java.time框架。这些新类取代了旧的java.util.Date/.Calendar类。它们的灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展。
我假设您的纪元日数在UTC。所以我们可以使用Instant
类,基本上是UTC中1970年第一时刻的纳秒数。
long myCountOfDays = 16_721L;
Instant instant = Instant.EPOCH.plus ( myCountOfDays , ChronoUnit.DAYS );
让我们调整一个时区。任意选择蒙特利尔。使用proper time zone name,而不是像“EST”或“IST”这样的3-4个字母代码。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
转储到控制台。
System.out.println ( "myCountOfDays: " + myCountOfDays + " from epoch: " + Instant.EPOCH + " in UTC is: " + instant + " and in Montréal is: " + zdt + "." );
跑步时。
myCountOfDays:16721 from epoch:1970-01-01T00:00:00Z in UTC is:2015-10-13T00:00:00Z andinMontréalis:2015-10-12T20:00-04:00 [America /蒙特利尔]。
答案 2 :(得分:1)
Joda-Time不支持闰秒。通过编写新的专业年表或对现有的ZonedChronology类进行一些增强,可以支持闰秒。在任何一种情况下,Joda-Time的未来版本默认情况下都不会启用闰秒。大多数应用程序都不需要它,并且可能会产生额外的性能成本。
这告诉我你不必担心这方面。
但是,不是做数学,而是使用DateTime#plusDays
或MutableDateTime#addDays
代替,使用The Epoch作为起点。
但我认为,自“大纪元”以来,你的日子已经过去了34天。允许跳跃天(并且你正在使用Gregorian年表,所以JodaTime也是如此)。