我从我的 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
编辑:您可以在没有 Date() 的情况下发送,只是数字,不是吗?如果您使用的是 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 包装。
分别考虑输入的两个部分。一个是从纪元开始的计数,以毫秒为单位,另一个是offset-from-UTC。
假设源使用与 java.time 相同的纪元(UTC 时间 1970 年的第一个时刻),我们可以使用它来实例化一个Instant
对象。An是UTCInstant
时间线上的时刻。
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 );
输入米利斯:1358157378910 | 瞬间:2013-01-14T09:56:18.910Z | 区域偏移:+01:00 | 时间:2013-01-14T10:56:18.910+01:00