使用带有日期/时间格式的date.setTime()的JSON数据时的日期错误

时间:2012-08-01 05:38:57

标签: java datetime-format android-date

我从中获得了日期/时间格式数据 http://earthquake.usgs.gov/earthquakes/feed/geojson/all/hour

这是数据引用:

"properties":{
    "mag":0.5,
    "place":"123km NNW of Talkeetna, Alaska",
    "time":1343795877,
    "tz":-480,
    "url":"/earthquakes/eventpage/ak10523664",
    "felt":null,
    "cdi":null,
    "mmi":null,
    "alert":null,
    "status":"AUTOMATIC",
    "tsunami":null,
    "sig":"4",
    "net":"ak",
    "code":"10523664",
    "ids":",ak10523664,",
    "sources":",ak,",
    "types":",general-link,general-link,geoserve,nearby-cities,origin,"
},

但是当我使用时:

Date date1 = new Date();
date1.setTime("1343795877"); 

结果是:1月16日星期五13:16:35 GMT + 00:00 1970 但正确的日期是星期三,2012年8月1日04:37:57 UTC(来自同一网站的CSV版本)

我怎样才能得到正确的时间?

3 个答案:

答案 0 :(得分:2)

数字“1343795877”是unix time - 自1970年以来经过的秒数。

您需要将它乘以1000,因为它是的时间,而日期构造函数需要毫秒。所以这将带来魔力:

Date d = new Date(1343795877*1000);

您可以使用在线UNIX to Date converter进行检查。

请记住,UNIX时间是UTC,并且它不会模仿用户时区 - 因此您需要应用您的时区。

我建议您使用JodaTime,这非常方便。

以下是转换的示例:

DateTime dt = new DateTime(1343795877*1000);
dt.withZone(DateTimeZone.forID("UTC"));

编辑:

DateTimeFormatter formatter = 
    DateTimeFormat.forPattern("dd-MM-yyyy HH:mm:ss, SSS [z]");
formatter.print(dt);

答案 1 :(得分:1)

首先你的语法错了。日期没有date.setTime(String)等方法。其date.setTime(Long)需要milliseconds as argument。你得到的是seconds所以只需乘以1000即可得到正确的日期。所以你的解决方案是date1.setTime(1343795877000L);

答案 2 :(得分:1)

简单地看一下:

new Date(epochTime * epochFormat) // '1343795877' this time format is known as epoch time

epochTime是长型的时间,例如。的 1343795877L
epochFormat 1000 如果epochTime ,则 1 如果毫秒 < / p>

在你的情况下,它在中乘以 1000

我认为您还应该使用SimpleDateFormatter 格式您的约会对象:

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE dd-MMM-yy", Locale.ENGLISH); // date format and locale you want to use
dateFormat.setTimeZone("Asia/Kolkata"); // can have your time zone
String date = dateFormat.format(new Date(epochTime * epochFormat));

日期格式查看here