json日期转换java日期_如何将传入的Json日期转换为java日期格式?

我正在研究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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值