java 如何将时间戳转换为日期和时间?

How to convert timestamp into date and time in java?

我在 json 中有一个来自 Linux 服务器的时间戳。我想使用 Java.

将其转换为简单的日期时间格式

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

这是我的 JSON 数据:

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

批次日期

"batch_date": 1419038000, 

看起来像纪元的秒数​​,

所以

new Date (batch_date * 1000); 

然后使用 SimpleDateFormat 应该可以解决问题

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

--代码--

    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

当我们想要read/parse一个字符串值作为日期时,我们应该知道该输入字符串的日期格式,否则我们会得到错误的日期值。

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

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

1) 请求 batch_date 值应采用您要求的格式。或者

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

没有这样的数据类型

没有"JSON timestamp"这样的东西。 JSON 有 very few defined data types。其中没有日期时间类型。

作为 by Scary Wombat states, your number is apparently a count of whole seconds from the Unix epoch of 1970. The java.util.Date class tracks time as milliseconds since the Unix epoch,而不是整秒。所以你需要乘以 1,000。您还需要处理 long 整数(64 位)而不是 int(32 位)。将大写字母 L 附加到数字文字,并将任何变量声明为 long.

java.util.Date/.Calendar 类 是出了名的麻烦。它们现在被 java.time package built into Java 8 and later, and/or the 3rd-party Joda-Time 库所取代。

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

请注意,java.time 和 Joda-Time 都支持分配时区。下面的代码分配 UTC 用于演示目的,但您可以分配 desired/expected 时区。

乔达时间

这是 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.time of Java 8.

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]