我编写了一个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日),这是错误的。我是以错误的方式传递格式吗?
答案 0 :(得分:4)
你应该大写M
。小写m
代表分钟,而大写代表月份。这是documentation。
答案 1 :(得分:1)
LocalDate.parse("2014/06/12".replace("/" , "-"))
.atStartOfDay(ZoneId.of("America/Montreal"))
.toEpochSecond()
Answer by Cornelissen是正确的,您的格式设置模式不正确。
您没有考虑时区。你的目标是计算自1970年开始时代以来的秒数。这涉及一天的时间,当一天开始。一天的开始在全球范围内因地区而异。法国巴黎的新日早些时候比蒙特利尔魁北克要早。
此外,您正在使用现在由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)等异常可能导致从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-since-epoch来跟踪。难以阅读,难以调试,容易出错,导致不同软件系统使用的不同时期的模糊性(至少使用了十几个时期)。
例证: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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。