我想将字符串“ 01/01/1900”(dd / MM / yyyy)转换为一个长值,表示从“ 01/01/1970”(dd / MM / yyyy)起的毫秒数。
我在这里尝试过:
long value = LocalDate //
.parse("01/01/1900", DateTimeFormatter.ofPattern("dd/MM/yyyy")) //
.atStartOfDay(ZoneId.of("UTC")) //
.toInstant() //
.toEpochMilli() //
;
但是,实际值为-2208992400000
。期望值为-2208988800000
。
我想念什么?
您没有运行粘贴的代码。
我与您所在的时区(欧洲中部)处于同一时区,而当我运行此确切的代码时,答案是-2208988800000
,正如您所期望的那样。
即使您弄乱了本地时区设置,与情况无关。代码段中的代码完全不依赖于系统默认时区。将字符串转换为LocalDate
实例无关紧要,通过提供显式区域将LocalDate转换为ZonedDateTime
无关紧要,然后将其转换为即时信息则无关紧要。 (而瞬间首先只是一个围绕千纪的包装纸,因此读取一个字段也无关紧要)。
可能您的系统的时区表已损坏,由于此tz数据已损坏,因此未在系统上正确定义时区“ UTC”。
请注意,这可行:
.atStartOfDay(ZoneOffset.UTC)
而且更惯用,我想是“更安全”。它避免了查找,并且避免了您可以使用fingerfinger的字符串。试一试,尽管我当然会担心损坏的tzdata文件。