Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从表示自纪元起天数的整数创建joda DateTime实例?_Java_Date_Datetime_Jodatime - Fatal编程技术网

Java 从表示自纪元起天数的整数创建joda DateTime实例?

Java 从表示自纪元起天数的整数创建joda DateTime实例?,java,date,datetime,jodatime,Java,Date,Datetime,Jodatime,在我的应用程序中,它保存了一个首选项,该首选项是一个整数,即自纪元以来的天数。(不相关,但用于每x天创建一次备份) 给定此值,如何可靠地创建jodaDateTime的实例 我试图通过乘法将其转换为毫秒,但由于天文学/太阳时间的原因,这是错误的 Joda Time不支持闰秒。通过编写一个新的、专门的年表,或者对现有的ZonedTimeology类进行一些增强,可以支持闰秒。在这两种情况下,Joda Time的未来版本默认情况下都不会启用闰秒。大多数应用程序都不需要它,而且它可能会带来额外的性能成本

在我的应用程序中,它保存了一个首选项,该首选项是一个整数,即自纪元以来的天数。(不相关,但用于每x天创建一次备份)

给定此值,如何可靠地创建joda
DateTime
的实例

我试图通过乘法将其转换为毫秒,但由于天文学/太阳时间的原因,这是错误的

Joda Time不支持闰秒。通过编写一个新的、专门的年表,或者对现有的ZonedTimeology类进行一些增强,可以支持闰秒。在这两种情况下,Joda Time的未来版本默认情况下都不会启用闰秒。大多数应用程序都不需要它,而且它可能会带来额外的性能成本

这对我来说意味着你不必担心这方面

但我不想做数学运算,而是用或者说,用纪元作为你的起点

不过,我假设你的“从纪元算起的天数”允许闰日(而且你使用的是格里高利年表,所以JodaTime也是)

Joda Time不支持闰秒。通过编写一个新的、专门的年表,或者对现有的ZonedTimeology类进行一些增强,可以支持闰秒。在这两种情况下,Joda Time的未来版本默认情况下都不会启用闰秒。大多数应用程序都不需要它,而且它可能会带来额外的性能成本

这对我来说意味着你不必担心这方面

但我不想做数学运算,而是用或者说,用纪元作为你的起点


不过,我假设“从纪元算起的天数”允许闰日(并且您使用的是格里高利年表,所以JodaTime也是如此)。

如果使用库函数,将天数乘以毫秒可能更可读。我强烈建议使用Joda.:)

从历元(GMT)算起,您有若干天的时间,您需要一个日期时间(日期+时间+时区)。在进一步讨论之前,至少需要指定如何处理时间和时区计算

最简单的方法(可能不是您想要的)是在本地时区中创建一个表示新纪元开始的瞬间,然后使用
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天创建一次备份,您可能需要在epoch(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);

如果使用库函数,则将天数乘以毫秒可能更具可读性。我强烈建议使用Joda.:)

从历元(GMT)算起,您有若干天的时间,您需要一个日期时间(日期+时间+时区)。在进一步讨论之前,至少需要指定如何处理时间和时区计算

最简单的方法(可能不是您想要的)是在本地时区中创建一个表示新纪元开始的瞬间,然后使用
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天创建一次备份,您可能需要在epoch(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);
杰夫·鲍曼的结论是正确的

我将在java.time框架中展示同样的想法,该框架旨在继承Joda time

java.time Java8及更高版本内置了新的Java.time框架。这些新类取代了旧的java.util.Date/.Calendar类。它们的灵感来源于JSR 310定义的Joda Time,并通过Three Ten Extra项目进行了扩展

我想你从大纪元算起的日子已经到了。所以我们可以使用这个类,基本上是从1970年第一刻开始的纳秒数,UTC

long myCountOfDays = 16_721L;
Instant instant = Instant.EPOCH.plus ( myCountOfDays , ChronoUnit.DAYS );
让我们调整到一个时区。随意选择蒙特利尔。使用a,切勿使用3-4个字母的代码,如“EST”或“IST”

转储到控制台

System.out.println ( "myCountOfDays: " + myCountOfDays + " from epoch: " + Instant.EPOCH + " in UTC is: " + instant + " and in Montréal is: " + zdt + "." );
跑步的时候

myCountOfDays:16721从纪元:1970-01-01T00:00:00Z开始,UTC时间为:2015-10-13T00:00:00Z,蒙特利尔时间为:2015-10-12T20:00-04:00[美国/蒙特利尔]

杰夫·鲍曼的结论是正确的

我将在java.time框架中展示同样的想法,该框架旨在继承Joda time

java.time Java8及更高版本内置了新的Java.time框架。这些新类取代了旧的java.util.Date/.Calendar类。它们的灵感来源于JSR 310定义的Joda Time,并通过Three Ten Extra项目进行了扩展

我想你从大纪元算起的日子已经到了。所以我们可以使用这个类,基本上是从1970年第一刻开始的纳秒数,UTC

long myCountOfDays = 16_721L;
Instant instant = Instant.EPOCH.plus ( myCountOfDays , ChronoUnit.DAYS );
让我们调整到一个时区。随意选择蒙特利尔。使用a,切勿使用3-4个字母的代码,如“EST”或“IST”

转储到控制台

System.out.println ( "myCountOfDays: " + myCountOfDays + " from epoch: " + Instant.EPOCH + " in UTC is: " + instant + " and in Montréal is: " + zdt + "." );
跑步的时候

myCountOfDays:16721从纪元:1970-01-01T00:00:00Z开始,UTC时间为:2015-10-13T00:00:00Z,蒙特利尔时间为:2015-10-12T20:00-04:00[美国/蒙特利尔]


我最初是通过执行Days.daysBetween(epoch,now)来计算日值的,因为文档中说“创建一个表示两个指定日期时间之间的天数的天数”,我相信您需要执行
epoch\u LOCALDATE.plusDays(yourDayCount+1)
@JamesWierzba感谢您的编辑。是的,您可能需要添加1,这取决于您是存储/读取代表23:59:59还是00:00:01的日期;这是留给读者的一个练习:)我最初是通过计算Days.daysBetween(epoch,now)来计算日值的,因为文档说明“创建一个表示两个指定日期时间之间的整天数的天数”,我相信