无法将日期转换为纪元时间

2022-06-11 00:00:00 datetime-format epoch java

这是我的示例代码

    String dt = "Oct 24 2019 12:00:00.000 AM UTC";
    String dt1="Oct 24 2019 11:59:59.000 PM UTC";
    SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS 
    aa zzz");
    Date date = df.parse(dt);
    Date date1 = df.parse(dt1);
    long epoch = date.getTime();
    long epoch1 = date1.getTime();
    System.out.println(epoch);
    System.out.println(epoch1);

此处指定AM和PM,但不接受该值并将异常抛出为

{"error_code":"INVALID_PARAMETER_VALUE","message":"Time range must have a start time earlier than the end time"}

如何在Java代码中指定AM/PM。 如何在Java代码中将昨天的日期和时间作为输入以转换为纪元。


解决方案

tl;dr

ZonedDateTime
.parse(
    "Oct 24 2019 12:00:00.000 AM UTC" ,
    DateTimeFormatter.ofPattern( "MMM d uuuu hh:mm:ss.SSS a z" ).withLocale( Locale.US ) 
)
.toInstant() 
.toEpochMilli() 

1571875200000

java.time

两个问题:

  • 作为commented by Heuberger,您使用的格式代码不正确。
  • 您正在使用几年前被现代java.time类取代的糟糕的Date-Time类。

为清楚起见,已重命名您的输入。

String inputStart = "Oct 24 2019 12:00:00.000 AM UTC";
String inputStop = "Oct 24 2019 11:59:59.000 PM UTC";

定义与您的输入匹配的格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM d uuuu hh:mm:ss.SSS a z" ).withLocale( Locale.US );

分析输入。

ZonedDateTime zdtStart = ZonedDateTime.parse( inputStart , f );
ZonedDateTime zdtStop = ZonedDateTime.parse( inputStop , f );

计算运行时间。我们应该比24小时少一秒。

Duration d = Duration.between( zdtStart , zdtStop );
显然,您想要的是自UTC,1970-01-01T00:00Z中1970年第一个时刻的纪元参考以来的毫秒数。首先从每个ZonedDateTime中提取构建块类InstantInstant表示UTC中的时刻。这门课让你审问自纪元以来的伯爵。注意,java.time类以纳秒为单位进行解析。因此,请求毫秒可能会导致数据丢失,忽略任何微秒或纳秒。

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

long millisStart = start.toEpochMilli() ;
long milliStop = stop.toEpochMilli() ;

转储到控制台。

System.out.println( "zdtStart = " + zdtStart );
System.out.println( "zdtStop = " + zdtStop );
System.out.println( "d = " + d );

System.out.println( "start = " + start );
System.out.println( "stop = " + stop );

System.out.println( "millisStart = " + millisStart );
System.out.println( "milliStop = " + milliStop );

zdtStart=2019-10-24T00:00Z[UTC]

zdtStop=2019-10-24T23:59:59Z[UTC]

d=PT23H59M59S

开始=2019-10-24T00:00:00Z

Stop=2019-10-24T23:59:59Z

毫秒开始=1571875200000

毫秒停止=1571961599000



关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期-时间类,如java.util.DateCalendar、&;SimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。和搜索堆栈溢出以获取许多示例和解释。规范为JSR 310。

Joda-Time项目现在位于maintenance mode中,建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8、Java SE 9、Java SE 10、Java SE 11以及更高版本--标准Java API的一部分,具有捆绑实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6和Java SE 7
    • 大部分java.time功能已后移植到ThreeTen-Backport中的Java 6&;7。
  • Android
    • 更高版本的Android绑定实现java.time类。
    • 对于更早版本的Android(<;26),ThreeTenABP项目适配ThreeTen-Backport(如上所述)。请参阅How to use ThreeTenABP…。

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能添加到java.time中提供了一个试验场。您可以在此处找到一些有用的类,如IntervalYearWeekYearQuarter和more。

相关文章