这是我的示例代码
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代码中今天的昨天日期和时间作为转换为纪元的输入。
答案 0 :(得分:1)
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
两个问题:
您的输入,为了清楚起见,已重命名。
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
中提取构建基类ZonedDateTime
。 Instant
代表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
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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