我正在研究Xero帐户Apis
在json的回复中我得到的日期如下
"Date":"/Date(1455447600000+1300)/",
获取dateString字段的日期也相同
"DateString":"2016-02-15T00:00:00",
我试图将上述日期转换为字符串,但获取不同的日期。 在我们的api中,两个日期相同,在Date字段和DateString字段中。
Long longDate=Long.valueOf("1455447600000")+Long.valueOf("1300");
Date date = new Date(longDate);
//TimeZone timeZone = TimeZone.getTimeZone("UTC"); //also tried this
Calendar cal=Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.getTime());
输出:Sun Feb 14 16:30:01 IST 2016 2月14日但在StringDate中它是15 Feb
JSON:
[
{
"Date":"/Date(1455447600000+1300)/",
"Type":"ACCREC",
"Total": 460,
"Status":"AUTHORISED",
"Contact": {
"Name":"nn",
"Phones": [
],
"Addresses": [
],
"ContactID":"6831fd62-d6f1-4dc7-9338-24566074ecf6",
"ContactGroups": [
],
"ContactPersons": [
],
"HasValidationErrors": false
},
"DueDate":"/Date(1455620400000+1300)/",
"Payments": [
],
"SubTotal": 460,
"TotalTax": 0,
"AmountDue": 460,
"HasErrors": false,
"InvoiceID":"dcf1f09e-3e98-443e-981e-cdd9f296d607",
"LineItems": [
{
"TaxType":"OUTPUT",
"ItemCode":"Item2",
"Quantity": 20,
"Tracking": [
],
"TaxAmount": 0,
"LineAmount": 460,
"LineItemID":"2a6c5078-a462-4e8c-b277-d1164885b7d9",
"UnitAmount": 23,
"AccountCode":"200",
"Description":"Item2"
}
],
"Reference":"43223",
"AmountPaid": 0,
"DateString":"2016-02-15T00:00:00",
"CreditNotes": [
],
"Prepayments": [
],
"CurrencyCode":"INR",
"CurrencyRate": 1,
"IsDiscounted": false,
"Overpayments": [
],
"DueDateString":"2016-02-17T00:00:00",
"InvoiceNumber":"INV-0002",
"AmountCredited": 0,
"HasAttachments": false,
"UpdatedDateUTC":"/Date(1455475695503+1300)/",
"LineAmountTypes":"Exclusive"
}
]
另见这个问题。
@ElliottFrisch错误关闭。 所谓的重复是关于解析符合ISO 8601标准的字符串。 这个问题是关于解析显然是一个大数字,一个来自时代的计数。
是的,它不重复。
@ Basil Bourque,你是对的。 @ElliottFrisch重新打开这个。
请重新打开这个问题。 因为我想帮助解决这个问题
将时间戳从yyyy-MM-ddThh:mm:ss:SSSZ格式转换为MM / dd / yyyy hh:mm:ss.SSS格式的可能重复? 从ISO8601到UTC看看
谢谢你的回复,但我知道如何转换日期格式。 但是我在这里得到了与api不同的约会。 转换为date之后与stringdate中提到的不同
+1300不是毫秒偏移量,它是一个小时+分钟的偏移量。
如果您只将日期部分解析为long:
Long longDate=Long.valueOf("1455447600000");
Date date = new Date(longDate);
System.out.println(date);
你得到(我在GMT时区)
Sun Feb 14 11:00:00 GMT 2016
你可以看到11 + 13 = 24,第二天24小时。
您可以从偏移量中获取时区,知道偏移量为13小时和零分钟:
Calendar c=Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getAvailableIDs(13*3600*1000)[0]));
c.setTimeInMillis(longDate);
DateFormat df=DateFormat.getDateInstance();
df.setTimeZone(c.getTimeZone());
System.out.println(df.format(c.getTime()));
哪能给我
Feb 15, 2016
在这里,我计算偏移为13小时,因此13 * 3600秒,因此13 * 3600 * 1000毫秒。所以你可以解析你的字符串:加号之前是什么时间,时区后面是什么。
java.time
我想贡献现代的解决方案
Pattern jsonDatePattern = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");
String dateFromJson ="/Date(1455447600000+1300)/";
Matcher m = jsonDatePattern.matcher(dateFromJson);
if (m.matches()) {
long epochMillis = Long.parseLong(m.group(1));
String offsetString = m.group(2);
OffsetDateTime dateTime = Instant.ofEpochMilli(epochMillis)
.atOffset(ZoneOffset.of(offsetString));
System.out.println(dateTime);
}
输出:
2016-02-15T00:00+13:00
这与您的JSON日期字符串中的日期和时间一致,并另外通知您UTC偏移量。
我正在使用并热烈推荐现代Java日期和时间API java.time。并且阻止问题和其他答案中使用的类Date,Calendar和TimeZone。它们已经过时了,现代Java日期和时间API可以更好地使用。
链接
Oracle教程:日期时间,解释如何使用java.time。