Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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 如何从LocalDate和LocalDateTime中提取历元?_Java_Time_Java 8_Epoch_Java Time - Fatal编程技术网

Java 如何从LocalDate和LocalDateTime中提取历元?

Java 如何从LocalDate和LocalDateTime中提取历元?,java,time,java-8,epoch,java-time,Java,Time,Java 8,Epoch,Java Time,如何从LocalDateTime或LocalDate的实例中提取Long的历元值?我试过了 下面,但它给了我其他的结果: LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")); System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives

如何从
LocalDateTime
LocalDate
的实例中提取
Long
的历元值?我试过了 下面,但它给了我其他的结果:

LocalDateTime time = LocalDateTime.parse("04.02.2014  19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy  HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
我想要的只是本地日期时间的值
1391539861
“04.02.2014 19:51:01”。 我的时区是
欧洲/Oslo
UTC+1和夏令时。

查看支持哪些字段。对于
LocalDateTime
,您将发现:

•NANO_OF_SECOND 
•NANO_OF_DAY 
•MICRO_OF_SECOND 
•MICRO_OF_DAY 
•MILLI_OF_SECOND 
•MILLI_OF_DAY 
•SECOND_OF_MINUTE 
•SECOND_OF_DAY 
•MINUTE_OF_HOUR 
•MINUTE_OF_DAY 
•HOUR_OF_AMPM 
•CLOCK_HOUR_OF_AMPM 
•HOUR_OF_DAY 
•CLOCK_HOUR_OF_DAY 
•AMPM_OF_DAY 
•DAY_OF_WEEK 
•ALIGNED_DAY_OF_WEEK_IN_MONTH 
•ALIGNED_DAY_OF_WEEK_IN_YEAR 
•DAY_OF_MONTH 
•DAY_OF_YEAR 
•EPOCH_DAY 
•ALIGNED_WEEK_OF_MONTH 
•ALIGNED_WEEK_OF_YEAR 
•MONTH_OF_YEAR 
•PROLEPTIC_MONTH 
•YEAR_OF_ERA 
•YEAR 
•ERA 
当然,不支持INSTANT_SECONDS字段,因为
LocalDateTime
不能引用任何绝对(全局)时间戳。但有用的是统计自1970-01-01以来经过的天数的字段。类似的想法也适用于类型
LocalDate
(支持的字段更少)

如果要获取不存在的millis-since-unix-epoch字段,还需要将时区从本地类型转换为全局类型。这种转换可以简单得多,请参见其他

回到您的问题和代码中的数字:

The result 1605 is correct
  => (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1
local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861
16105L*86400+71461=1391543461秒自1970-01-01T00:00:00(注意,无时区) 然后可以减去时区偏移量(如果以毫秒为单位,请注意可能乘以1000)

在给定时区信息后更新:

The result 1605 is correct
  => (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1
local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861
与JSR-310-1代码一样,具有两种等效方法:

long secondsSinceUnixEpoch1 =
  LocalDateTime.of(2014, 2, 4, 19, 51, 1).atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();

long secondsSinceUnixEpoch2 =
  LocalDate
    .of(2014, 2, 4)
    .atTime(19, 51, 1)
    .atZone(ZoneId.of("Europe/Oslo"))
    .toEpochSecond();

LocalDate
LocalDateTime
不包含有关时区或时间偏移的信息,如果没有这些信息,则自历元起的秒数将是模糊的。但是,通过传递
ZoneId
实例,这些对象有几种方法可以将它们转换为带有时区的日期/时间对象

LocalDate

LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();
LocalDateTime

LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();

您需要的转换需要UTC/Greewich或时区的偏移量

如果有偏移量,则此任务有一个on
LocalDateTime

long epochSec = localDateTime.toEpochSecond(zoneOffset);
如果只有
ZoneId
,则可以从
ZoneId
获取
ZoneOffset

ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);
但您可能会发现通过
ZoneDateTime
进行转换更简单:

long epochSec = ldt.atZone(zoneId).toEpochSecond();

“Millis-since-unix-epoch”表示一个瞬间,因此您应该使用instant类:

private long toEpochMilli(LocalDateTime localDateTime)
{
  return localDateTime.atZone(ZoneId.systemDefault())
    .toInstant().toEpochMilli();
}
从人类可读的日期转换为纪元:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;
String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));
纪元转换为人类可读日期

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;
String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));
对于其他语言转换器:
这是一种不使用时区的方法:

LocalDateTime now = LocalDateTime.now();
long epoch = (now.getLong(ChronoField.EPOCH_DAY) * 86400000) + now.getLong(ChronoField.MILLI_OF_DAY);

请解释您的预期号码1396468261。我没有时区修正:1391543461(见我答案中的编辑)。差57天@MenoHochschild我已经用时区信息更新了我的问题,并将GTM的实际值更正为localtime。除了手动计算之外,还有没有更简单的方法来获取某些
LocalDateTime
的历元?暂停后返回,请参阅我的更新。感谢您的解释。通过使用
LocalDateTime=LocalDateTime.parse(“04.02.2014 19:51:01”,DateTimeFormatter.of模式(“dd.MM.yyyy HH:MM:ss”))获得正确的结果然后
Long epoch=time.atZone(ZoneId.of(“欧洲/奥斯陆”)).toepochssecond()。是否可以避免使用ZoneId,或与自定义的常量ZoneId实例(等于+0,表示GMT)一起使用?我这样问是因为我希望所有的计算都被标准化。另外,我该如何做相反的事情:从历元时间转换为LocalDate/LocalDateTime(也不带ZoneId,或使用GMT格式)?没关系。找到它:
ZoneOffset.ofOffset(“UTC”,ZoneOffset.ofHours(0))
一个更简单的方法就是
long epoch=time.toEpochSecond(ZoneOffset.UTC)
对于UTC情况,或者您已经知道时区的情况,或者
long epoch=time.toEpochSecond(ZoneId.systemDefault())如果你想走这条路。这听起来可能很可笑,但是把历元转换回LocalDate,LocalTime&localdatetime怎么样?别介意,我想我找到了
Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
如果您只关心UTC,那么就有
long epochec=localDateTime.toepochssecond(ZoneOffset.UTC)
使用
ZoneId.systemDefault()
是不正确的,因为unix epoch引用了UTC。这并没有回答这个问题。