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

时间:2014-06-14 06:51:10

标签: java datetime simpledateformat

我编写了一个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日),这是错误的。我是以错误的方式传递格式吗?

2 个答案:

答案 0 :(得分:4)

你应该大写M。小写m代表分钟,而大写代表月份。这是documentation

答案 1 :(得分:1)

TL;博士

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

详细

Answer by 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)等异常可能导致从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的期望值对我没有意义。使用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-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。