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

时间:2019-10-25 06:58:35

标签: java datetime-format epoch

这是我的示例代码

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

2 个答案:

答案 0 :(得分: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 );

显然,您想要从1970-01-01T00:00Z UTC中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.DateCalendarSimpleDateFormat

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您需要使用以下日期格式:

SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy hh:mm:ss.SSS a zzz",Locale.US);

对于AM / PM标记,使用'a'。对于reference

例如

import java.util.*;
import java.text.*;
public class Main
{
    public static void main(String[] args) {
        try{
            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 a zzz",Locale.US);
            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);  
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

输出:

1571918400000                                                                                                                                                                      
1571918399000
相关问题