如何在Java中将时间戳转换为日期和时间?

5

我有一个来自Linux服务器的JSON时间戳,我想使用Java将其转换为简单的日期时间格式。

我需要以下格式的日期和时间:dd-mm-yyyy hh:mm:ss

这是我的JSON数据:

[
  { 
    "batch_date": 1419038000
  }, 
  {
    "batch_date": 1419037000
  }
]

你是如何解析Json的?看看gson或jackson。 - beresfordt
1
@pavankumarparasa 请避免发布无关信息和数据。将您的情况最小化,仅保留必要的部分以说明您的问题。请参阅如何创建简洁完整且可验证的示例 - Basil Bourque
3个回答

8
批处理日期
"batch_date": 1419038000, 

看起来是从纪元开始算的秒数,

所以

new Date (batch_date * 1000); 

那么使用SimpleDateFormat应该能解决问题。

SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

-- code --

    long batch_date = 1419038000; 
    Date dt = new Date (batch_date * 1000); 

    SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    System.out.println(sfd.format(dt));

-- 输出 --

20-12-2014 10:13:20

你的意思是 HH,不是 hh - Jon Skeet
@ScaryWombat,我们能读取时间戳吗?不使用这些日期格式。我的意思是仅凭外观,我们能否判断它类似于哪一年、哪个月或哪一天。 - Prabs
时间戳是自1970年01月01日以来的秒数,如果你有技能,你可以计算出来,但为什么要这样做呢? - Scary Wombat

3

没有这种数据类型

“JSON时间戳”这种东西并不存在。JSON仅有极少定义的数据类型,其中没有日期时间类型。

正如Scary Wombat所说的正确答案,你的数字显然是从1970年Unix纪元以来的整秒数计算而来。java.util.Date类将时间跟踪为自1970年Unix纪元以来的毫秒数,而不是整秒数。因此,您需要乘以1000。您还需要处理long整数(64位),而不是int(32位)。在数字文字后添加大写字母L,并将任何变量声明为long

java.util.Date/.Calendar类非常麻烦。它们现在被Java 8及更高版本内置的java.time包和/或第三方Joda-Time库所取代。

各种JSON处理库都支持转换器,用于创建java.time或Joda-Time对象。或者您可以在代码中执行下面所示的转换。

请注意,java.time和Joda-Time都支持分配时区。下面的代码将UTC分配给演示目的,但您可以分配您所需/期望的时区。

Joda-Time

这里是一些Joda-Time 2.8.1中的代码,显示了将输入数字用作秒或毫秒的用法。

long secondsSinceEpoch = 1419038000L;
DateTime dateTimeSeconds = new DateTime( secondsSinceEpoch , DateTimeZone.UTC );
DateTime dateTimeMillis = new DateTime( secondsSinceEpoch * 1000L , DateTimeZone.UTC );  // Note the crucial "L" appended to the numeric literal.

将内容输出到控制台。

System.out.println( "dateTimeSeconds: " + dateTimeSeconds );
System.out.println( "dateTimeMillis: " + dateTimeMillis );

运行时。

dateTimeSeconds: 1970-01-17T10:10:38.000Z
dateTimeMillis: 2014-12-20T01:13:20.000Z

java.time

与上面类似的代码,但使用Java 8的java.time。

Instant instant = Instant.ofEpochSecond( 1419038000L );
ZonedDateTime zdtUtc = ZonedDateTime.ofInstant( instant , ZoneOffset.UTC );
ZonedDateTime zdtMontréal = zdtUtc.withZoneSameInstant( ZoneId.of( "America/Montreal" ) );

转储到控制台。

System.out.println( "zdtUtc: " + zdtUtc );
System.out.println( "zdtMontréal: " + zdtMontréal );

运行时。

zdtUtc: 2014-12-20T01:13:20Z
zdtMontréal: 2014-12-19T20:13:20-05:00[America/Montreal]

我的意思是......我在JSON中有一个时间戳 - pavaniiitn
关于时区的评论提供了很好的信息!我一直想知道为什么时间部分显示的是01:13:20.000Z而不是像Scary Wombat一样是10:13:20! - Didier68

-3

当我们想要将字符串值解析为日期时,我们应该知道输入字符串的日期格式,否则我们将得到错误的日期值。

batch_date:1419038000 这个值的日期格式是什么?

如果我们想要以所需格式(例如:'dd-mm-yyyy hh:mm:ss')获取日期值,有两种可能的方法。

1)请求batch_date值应该是您需要的格式。或者

2)如果batch_date值是另一种格式,我们应该知道原始格式,并使用SimpleDateFormat解析方法构建一个带有原始格式的Date对象,然后使用另一个SimpleDateFormat格式化方法将其转换为所需格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接