java epoch time_关于java:在epoch中转换日期格式

我有一个日期格式的字符串,如

Jun 13 2003 23:11:52.454 UTC

包含millisec ...我想在epoch中转换。

Java中是否有可用于执行此转换的实用程序?

此代码显示如何使用java.text.SimpleDateFormat从String解析java.util.Date:

String str ="Jun 13 2003 23:11:52.454 UTC";

SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");

Date date = df.parse(str);

long epoch = date.getTime();

System.out.println(epoch); // 1055545912454

Date.getTime()以毫秒为单位返回纪元时间。

一切都很好,但不要抛出异常。

@Anirudh main包裹已删除...

您还可以使用新的Java 8 API

import java.time.ZonedDateTime;

import java.time.format.DateTimeFormatter;

public class StackoverflowTest{

public static void main(String args[]){

String strDate ="Jun 13 2003 23:11:52.454 UTC";

DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");

ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);

System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454

}

}

DateTimeFormatter类替换旧的SimpleDateFormat。然后,您可以创建ZonedDateTime,从中可以提取所需的纪元时间。

主要优点是您现在是线程安全的。

感谢Basil Bourque的评论和建议。阅读他的答案以获取全部细节。

TL;博士

ZonedDateTime.parse(

"Jun 13 2003 23:11:52.454 UTC" ,

DateTimeFormatter.ofPattern ("MMM d uuuu HH:mm:ss.SSS z" )

)

.toInstant()

.toEpochMilli()

1055545912454

java.time

本答案扩展了洛克尼的答案。

DateTimeFormatter

首先通过创建DateTimeFormatter对象来定义格式模式以匹配输入字符串。

String input ="Jun 13 2003 23:11:52.454 UTC";

DateTimeFormatter f = DateTimeFormatter.ofPattern ("MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

将字符串解析为ZonedDateTime。您可以将该类视为:(Instant + ZoneId)。

ZonedDateTime zdt = ZonedDateTime.parse ("Jun 13 2003 23:11:52.454 UTC" , f );

zdt.toString(): 2003-06-13T23:11:52.454Z[UTC]

56578807c5bac0a98b1a8ea1b6d7a998.png

计数从历元

我不建议将日期时间值作为从纪元开始计算。这样做会使调试变得棘手,因为人类无法从数字中辨别出有意义的日期时间,因此无效/意外值可能会漏掉。此类计数也是模糊的,粒度(整秒,毫秒,微米,纳米等)和时期(各种计算机系统中至少二十几个)。

但是如果你坚持,你可以从1970年的第一个时刻(UTC(1970-01-01T00:00:00)到Instant级获得毫秒数。请注意,这意味着数据丢失,因为您将任何纳秒缩短为毫秒。

Instant instant = zdt.toInstant ();

instant.toString(): 2003-06-13T23:11:52.454Z

long millisSinceEpoch = instant.toEpochMilli() ;

1055545912454

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date,Calendar和& SimpleDateFormat。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要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功能都被反向移植到Java 6& 7在ThreeTen-Backport。

Android的

更高版本的Android捆绑java.time类的实现。

对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。请参见如何使用ThreeTenABP ....

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter等。

String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10

DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");

LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);

LocalDateTime now = LocalDateTime.now();

ZoneId zone = ZoneId.of("Asia/Kolkata");

ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

long a= zdt.toInstant(zoneOffSet).toEpochMilli();

Log.d("time","---"+a);

你可以从这个链接获得区域ID!

感谢您的贡献。 这不是完全相同的问题。 我得到java.time.format.DateTimeParseException: Text '15-3-2019 09:50 AM' could not be parsed at index 3。 最后,正确的转换是long a = LocalDateTime.parse(dateTime, dtf).atZone(zone).toInstant().toEpochMilli();。

创建将字符串转换为日期格式的常用方法

public static void main(String[] args) throws Exception {

long test = ConvertStringToDate("May 26 10:41:23","MMM dd hh:mm:ss");

long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM","EEE, MMM dd yyyy, hh:mm a");

long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC","MMM dd yyyy HH:mm:ss.SSS zzz");

}

private static long ConvertStringToDate(String dateString, String format) {

try {

return new SimpleDateFormat(format).parse(dateString).getTime();

} catch (ParseException e) {}

return 0;

}

不要吞下例外。 他们有意义。 通常是一个重要的。

我建议远离现在已久的过时日期和时间类,如SimpleDateFormat。 2011年,当问到这个问题时,我也使用了它们。 不再。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值