使用java中的SimpleDateFormat将yyyy / mm / dd解析为纪元时间戳

我编写了一个java实用程序函数来转换yyyy / mm / dd,如下所示

public static long gettimestamp(String dateString) { SimpleDateFormat df = new SimpleDateFormat("yyyy/mm/dd"); Date date; try { date = df.parse(dateString); } catch (java.text.ParseException e) { return 0; } long epoch = date.getTime(); return (epoch / 1000); } 

在通过2014/06/12 – 它给出1389465360(= 2014年1月11日)这是错误的。 我以错误的方式传递格式吗?

你应该大写M 小写字母m表示分钟,而大写字母表示月份。 这是文档 。

TL;博士

 LocalDate.parse("2014/06/12".replace("/" , "-")) .atStartOfDay(ZoneId.of("America/Montreal")) .toEpochSecond() 

细节

Cornelissen的答案是正确的,您的格式模式不正确。

时区

你没有考虑时区。 你的目标是计算自1970年开始时代以来的秒数。这涉及一天的时间,当一天开始。 一天的开始在全球范围内因地区而异。 法国巴黎的新日早些时候比蒙特利尔魁北克要早。

避免旧的日期时间类

此外,您正在使用现在由java.time类取代的麻烦的旧遗留日期时间类。

使用java.time

LocalDate类表示没有时间且没有时区的仅日期值。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu/mm/dd" ); LocalDate ld = LocalDate.parse( "2014/06/12" , f ); 

或者,您可以通过将斜杠字符替换为连字符来转换输入字符串以符合标准ISO 8601格式。 在解析/生成字符串时,java.time类默认使用ISO 8601格式。

LocalDate调整为您的日期上下文所指定的特定时区。 我们得到一个ZonedDateTime对象。

让java.time确定一天的开始时间。 不要硬编码00:00:00 。 在某些时区中,诸如夏令时(DST)之类的exception可能导致从01:00:00开始的一天开始。

 ZoneId z = ZoneId.of( "America/Montreal" ); // Or ZoneOffset.UTC if you meant UTC (GMT). ZonedDateTime zdt = ld.atStartOfDay( z ); 

您可以询问自1970-01-01T00:00:00Z时代以来的整秒数。

 long secondsSinceEpoch = zdt.toEpochSecond(); 

1402545600

避免使用count-from-epoch

顺便说一下,我强烈建议不要将日期时间值作为count-since-epoch来跟踪。 难以阅读,难以调试,容易出错,导致不同软件系统使用的不同时期的模糊(至少使用了十几个时期)。

一个1389465360 :您对1389465360预期价值对我没有意义。 使用ZoneOffset.UTC我得到该日期的开始为1402531200 。 您的预期值会产生2014年1月11日18:36的时间,此时将被解释为UTC自1970年以来的整秒计数。

 System.out.println ( Instant.ofEpochSecond ( 1_389_465_360L ).toString () ); 

2014-01-11T18:36:00Z

关于java.time

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

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

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

许多java.timefunction在ThreeTen- Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android (请参阅如何使用… )。

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