[英]Parse json date string in android
我在Android應用程序中從服務器獲得了1970年以后的毫秒數的json字符串。
看起來像這樣: \\/Date(1358157378910+0100)\\/
。
我如何將其解析為Java日歷對象,或者只是從中獲取一些日期值? 我應該從正則表達式開始,只是得到毫秒? 服務器是.NET。
謝謝
時間似乎也有時區,所以我會做這樣的事情:
String timeString = json.substring(json.indexOf("(") + 1, json.indexOf(")"));
String[] timeSegments = timeString.split("\\+");
// May have to handle negative timezones
int timeZoneOffSet = Integer.valueOf(timeSegments[1]) * 36000; // (("0100" / 100) * 3600 * 1000)
int millis = Integer.valueOf(timeSegments[0]);
Date time = new Date(millis + timeZoneOffSet);
從接受的答案復制,修復了一些錯誤:)
String json = "Date(1358157378910+0100)";
String timeString = json.substring(json.indexOf("(") + 1, json.indexOf(")"));
String[] timeSegments = timeString.split("\\+");
// May have to handle negative timezones
int timeZoneOffSet = Integer.valueOf(timeSegments[1]) * 36000; // (("0100" / 100) * 3600 * 1000)
long millis = Long.valueOf(timeSegments[0]);
Date time = new Date(millis + timeZoneOffSet);
System.out.println(time);
是啊,ü可以substring
你的json
從“(”到“)”,轉換成string
來米利斯,並通過在calendar
對象。
String millisString = json.substring(json.indexOf('('), json.indexOf(')'));
我想你可以這樣:
json.getAsJsonPrimitive().getAsString();
json
它是一個JsonElement
編輯:你可以發送沒有日期(),只是數字,不是嗎? 如果您使用的是JSON,為什么不使用Date對象?
試試這個..
String jsonDate = "\/Date(1358157378910+0100)\/";
String date = "";
try {
String results = jsonDate.replaceAll("^/Date\\(","");
results = results.substring(0, results.indexOf('+'));
long time = Long.parseLong(results);
Date myDate = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
date = sdf.format(myDate);
System.out.println("Result Date: "+date);
}
catch (Exception ex) {
ex.printStackTrace();
}
這是一個更完整的解決方案,基於@pablisco答案:
public class DateUtils {
public static Date parseString(String date) {
String value = date.replaceFirst("\\D+([^\\)]+).+", "$1");
//Timezone could be either positive or negative
String[] timeComponents = value.split("[\\-\\+]");
long time = Long.parseLong(timeComponents[0]);
int timeZoneOffset = Integer.valueOf(timeComponents[1]) * 36000; // (("0100" / 100) * 3600 * 1000)
//If Timezone is negative
if(value.indexOf("-") > 0){
timeZoneOffset *= -1;
}
//Remember that time could be either positive or negative (ie: date before 1/1/1970)
time += timeZoneOffset;
return new Date(time);
}
}
一些其他答案,例如pablisco ,對於解析字符串以提取數字是正確的,這是自紀元以來的毫秒數。 但他們使用過時的日期時間類。
Java 8及更高版本內置了java.time框架。 一個巨大的進步。 靈感來自Joda-Time 。 由JSR 310定義。 由ThreeTen-Extra項目擴展。 通過ThreeTen-BackPort項目反向移植到Java 6和7,該項目由ThreeTenABP項目包裝為Android。
分別考慮輸入的兩個部分。 一個是來自epoch的計數,以毫秒為單位,另一個是來自UTC的偏移量 。
假設源使用與java.time相同的紀元(1970年的第一個UTC時刻),我們可以使用它來實例化一個Instant
對象。 Instant
是UTC時間軸上的一個時刻。
String inputMillisText = "1358157378910";
long inputMillis = Long.parseLong ( inputMillisText );
Instant instant = Instant.ofEpochMilli ( inputMillis );
接下來我們解析來自UTC的偏移量。 這里的訣竅是我們不知道來源的意圖。 也許他們的意思是預期的日期時間比 UTC 晚一個小時,因此我們應該將該偏移文本作為一個公式,增加一個小時來達到UTC。 或者他們意味着顯示的時間比 UTC 早一個小時。 常用的ISO 8601標准定義了后者,因此我們將使用它。 但你真的應該調查你的數據源的意圖。
String inputOffsetText = "+0100";
ZoneOffset zoneOffset = ZoneOffset.of ( inputOffsetText );
我們將Instant
和ZoneOffset
結合起來以獲得OffsetDateTime
。
OffsetDateTime odt = OffsetDateTime.ofInstant ( instant , zoneOffset );
轉儲到控制台。
System.out.println ( "inputMillis: " + inputMillis + " | instant: " + instant + " | zoneOffset: " + zoneOffset + " | odt: " + odt );
inputMillis:1358157378910 | 時間:2013-01-14T09:56:18.910Z | zoneOffset:+01:00 | odt:2013-01-14T10:56:18.910 + 01:00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.