使用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
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。
许多java.timefunction在ThreeTen- Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android (请参阅如何使用… )。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。