如何使用 java.time 将带有可选时间的日期时间输入字符串转换为 UNIX 时间
How to convert date time input string with optional time into UNIX time using java.time
我正在使用 java.time 将日期时间转换为 unix 时间,但当我使用不同的输入格式时,结果并不总是正确的。在下面的代码中,输出不正确。它将“2016-06-21-10-19-22”转换为 2016-06-21T00:00:00+00:00。
如果输入“04/28/2016”,"MM/dd/yyyy",结果正确。
我想知道如何编写一个函数,将带时间的日期和不带时间的日期都转换为正确的 timeInSeconds?
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd-HH-mm-ss");
String dateTimeString = "2016-06-21-10-19-22";
LocalDate date = LocalDate.parse(dateTimeString, formatter);
ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));
Instant i = resultado.toInstant();
long timeInSeconds = i.getEpochSecond();
int nanoAdjustment = i.getNano();
System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");//1466467200 seconds 0 nanoseconds
您的代码中存在多个问题,让我尝试一一列出
- 你总是把输入的字符串解析成LocalDate,即使它是用时间表示的
LocalDate date = LocalDate.parse("2016-06-21-10-19-22", formatter); //2016-06-21
LocalDate date = LocalDate.parse("2016-06-21", formatter); //2016-06-21
- 将输入字符串解析为
LocalDate
后,您总是将其转换为 ZoneDateTime,开始时间为 00:00:00
ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC")); //2016-06-21T00:00Z[UTC]
- 最后你将相同的
ZonedDateTime
转换为 Instant 而不管输入的时间,这就是为什么你总是得到相同的结果
Instant i = resultado.toInstant().getEpochSecond(); //1466467200
解决此问题的最佳方法是使用 DateTimeFormatter with optional time representation in formatter, and using parseBest
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[-HH-mm-ss]");
TemporalAccessor dt = parser.parseBest(dateTimeString, LocalDateTime::from, LocalDate::from);
if (dt instanceof LocalDateTime) {
(LocalDateTime) dt).atOffset(ZoneOffset.UTC).toInstant();
} else {
(LocalDate) dt).atStartOfDay(ZoneOffset.UTC).toInstant();
}
我正在使用 java.time 将日期时间转换为 unix 时间,但当我使用不同的输入格式时,结果并不总是正确的。在下面的代码中,输出不正确。它将“2016-06-21-10-19-22”转换为 2016-06-21T00:00:00+00:00。
如果输入“04/28/2016”,"MM/dd/yyyy",结果正确。
我想知道如何编写一个函数,将带时间的日期和不带时间的日期都转换为正确的 timeInSeconds?
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd-HH-mm-ss");
String dateTimeString = "2016-06-21-10-19-22";
LocalDate date = LocalDate.parse(dateTimeString, formatter);
ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));
Instant i = resultado.toInstant();
long timeInSeconds = i.getEpochSecond();
int nanoAdjustment = i.getNano();
System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");//1466467200 seconds 0 nanoseconds
您的代码中存在多个问题,让我尝试一一列出
- 你总是把输入的字符串解析成LocalDate,即使它是用时间表示的
LocalDate date = LocalDate.parse("2016-06-21-10-19-22", formatter); //2016-06-21
LocalDate date = LocalDate.parse("2016-06-21", formatter); //2016-06-21
- 将输入字符串解析为
LocalDate
后,您总是将其转换为 ZoneDateTime,开始时间为00:00:00
ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC")); //2016-06-21T00:00Z[UTC]
- 最后你将相同的
ZonedDateTime
转换为 Instant 而不管输入的时间,这就是为什么你总是得到相同的结果
Instant i = resultado.toInstant().getEpochSecond(); //1466467200
解决此问题的最佳方法是使用 DateTimeFormatter with optional time representation in formatter, and using parseBest
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[-HH-mm-ss]");
TemporalAccessor dt = parser.parseBest(dateTimeString, LocalDateTime::from, LocalDate::from);
if (dt instanceof LocalDateTime) {
(LocalDateTime) dt).atOffset(ZoneOffset.UTC).toInstant();
} else {
(LocalDate) dt).atStartOfDay(ZoneOffset.UTC).toInstant();
}