SimpleDateFormat 问题

问题描述 投票:0回答:3

我下面有这个代码,但我没有得到正确的日期 例如输入的日期是 01/01/2013 12:35 但 format.parse 仅返回 dd/mm/yyyy 并排除 hh:mm

这是一个样本日期时间 03/09/2012 15:26,输出为 1346649960000

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
long data = format.parse(childNode.getTextContent()).getTime();

关于为什么这会奇怪地格式化时间有任何线索吗?

java date-formatting
3个回答
1
投票

我认为它给出了有效的输出。 getTime() 返回自 1970 年 1 月 1 日 00:00:00 以来的毫秒数。所以最后 3 个零代表毫秒


1
投票

我在您的代码中看到两个问题:

  1. 如果解析 24 小时格式的时间,则必须使用 HH 而不是 hh。
  2. 您可能需要指定用于解析的时区,您所在时区的 15:26 发生在另一个时区的不同时间。

请参阅下面我提出的修复方案:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
format.setTimeZone(TimeZone.getTimeZone("UTC"));

0
投票

java.time

您的输入字符串

03/09/2012 15:26
缺少时区或相对于UTC的偏移量指示符。因此,在现代 Java 中,解析为
LocalDateTime

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

显然您想要从 UTC 1970 年第一个时刻(1970-01-01T00:00Z)的纪元参考开始计算毫秒数。

您无法从该输入中得出该计数。您的输入缺少时区或偏移量的上下文。因此,我们无法知道您的输入是否意味着日本东京的 3 点半左右、法国图卢兹的 3 点半左右或美国俄亥俄州托莱多的 3 点半左右 — 三个截然不同的时刻,相隔几个小时。

如果您知道预期的时区,请应用

ZoneId
来获取
ZonedDateTime

或者您可能希望该日期和时间代表 UTC 中的某个时刻,与 UTC 的偏移量为零时-分-秒。如果是这样,则应用零偏移量来生成

OffsetDateTime
对象。然后提取一个
Instant
,并从中得到一个计数。

long count = ldt.atOffset( ZoneOffset.UTC ).toInstant().getEpochSecond() ; 
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.