无法将日期转换为纪元时间[重复]

问题描述 投票:-3回答:2

这是我的示例代码

    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代码中今天的昨天日期和时间作为转换为纪元的输入。

java datetime-format epoch
2个回答
1
投票

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类所取代的可怕的日期时间类。
您的输入,为清楚起见,已重命名。

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年第一时刻的纪元参考以来的毫秒数。首先从每个Instant中提取构建模块类ZonedDateTimeInstant代表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

停止= 2019-10-24T23:59:59Z

millisStart = 1571875200000

milliStop = 1571961599000


Table of date-time types in Java, both modern and legacy


关于

java.time

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

要了解更多信息,请参见Calendar。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat

SimpleDateFormat项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。

您可以直接与数据库交换

java.time

对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。从哪里获取java.time类?

    JDBC driverJDBC 4.2java.sql.*Java SE 8和更高版本-具有捆绑实现的标准Java API的一部分。
    • Java 9添加了一些次要功能和修复。
  • [Java SE 9Java SE 10
    • << java.time的大多数功能>在Java SE 11中被反向移植到Java 6和7。
  • Java SE 6
    • java.time
  • 类的Android捆绑包实现的最新版本。
  • 对于较早的Android(<26),Java SE 7项目改编为ThreeTen-Backport(如上所述)。参见Android
  • ThreeTenABP项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如ThreeTen-BackportHow to use ThreeTenABP…ThreeTen-ExtraInterval

    0
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.