[英]How to convert Timestamp into Date format in java
我有一個像這樣的時間戳(形成一個 json 響應):
"/日期(1479974400000-0800)/"
我正在嘗試使用此功能將時間戳轉換為日期:
public String getDate() {
Calendar cal = Calendar.getInstance(Locale.ENGLISH);
cal.setTimeInMillis(time);
String date = DateFormat.format("dd-MM-yyyy", cal).toString();
return date;
}
如何將此時間戳轉換為日期格式?
Java 可以直接將您的字符串解析為OffsetDateTime
。 使用此格式化程序:
private static final DateTimeFormatter JSON_TIMESTAMP_FORMATTER
= new DateTimeFormatterBuilder()
.appendLiteral("/Date(")
.appendValue(ChronoField.INSTANT_SECONDS, 1, 19, SignStyle.NEVER)
.appendValue(ChronoField.MILLI_OF_SECOND, 3)
.appendOffset("+HHMM", "Z")
.appendLiteral(")/")
.toFormatter();
然后做:
String time = "/Date(1479974400000-0800)/";
OffsetDateTime odt = OffsetDateTime.parse(time, JSON_TIMESTAMP_FORMATTER);
System.out.println(odt);
輸出是:
2016-11-24T00:00-08:00
在您的字符串中, 1479974400000
是自 1970 年 1 月 1 日 00:00 UTC 的紀元以來的毫秒數,而-0800
是距 UTC 的 -8 小時 0 分鍾的偏移量(例如對應於太平洋標准時間)。 要解析毫秒,我們需要解析自紀元以來的秒數(除最后三位之外的所有數字),然后解析秒的毫秒(最后三位)。 通過將毫秒字段的寬度指定為 3 Java 可以做到這一點。 為了使其工作,它要求該數字至少為 4 位而不是負數,即不在紀元之后的前 999 毫秒內或更早。 這也是我在格式化程序中指定不得對秒進行簽名的原因。
我將Z
指定為偏移量為零,我不知道你是否會收到這個。 仍然可以解析零的+0000
偏移量。
首先,我想確保我擁有的時間戳確實符合我期望的格式。 我想確保有一天它沒有,我不只是假裝用戶會得到不正確的結果而不知道它們是不正確的。 因此,為了解析時間戳字符串,由於我沒有找到可以接受自紀元以來毫秒數的日期時間格式,所以我使用了正則表達式:
String time = "/Date(1479974400000-0800)/";
Pattern pat = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");
Matcher m = pat.matcher(time);
if (m.matches()) {
Instant i = Instant.ofEpochMilli(Long.parseLong(m.group(1)));
System.out.println(i);
}
這打印:
2016-11-24T08:00:00Z
如果你想要一個老式的java.util.Date
:
System.out.println(Date.from(i));
在我的電腦上打印
Thu Nov 24 09:00:00 CET 2016
這將取決於您的時區。
我不清楚您是否需要使用區域偏移量以及用於什么目的。 您可以像這樣從匹配器中檢索它:
ZoneOffset zo = ZoneOffset.of(m.group(2));
System.out.println(zo);
這打印:
-08:00
區域偏移量可以與其他時間類一起使用,例如OffsetDateTime
。 例如:
OffsetDateTime odt = OffsetDateTime.ofInstant(i, zo);
System.out.println(odt);
不過,我不願提及這一點,因為我不知道它是否是您需要的。 在任何情況下,它都會打印:
2016-11-24T00:00-08:00
如果按日期表示 Date 實例,那么您可以這樣做:
new Date(Long.parseLong("\/Date(1479974400000-0800)\/".substring(7, 20)));
我假設此信息保存代表 Epoch 和 TimeZone 的字符串
"/日期(1479974400000-0800)/"
你需要去掉所有不必要的部分,只保留1479974400000-0800
那么時代是1479974400000我猜時區是0800
然后做:
String[] allTimeInfo = "1310928623-0800".split("-");
DateFormat timeZoneFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
timeZoneFormat.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
Date time = new java.util.Date(Long.parseLong(allTimeInfo[0]));
System.out.println(time);
System.out.println(timeZoneFormat.format(time));
對我有用的解決方案是這樣的:
String str = obj.getString("eventdate").replaceAll("\\D+", "");
String upToNCharacters = str.substring(0, Math.min(str.length(), 13));
DateFormat timeZoneFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
timeZoneFormat.setTimeZone(TimeZone.getTimeZone("GMT-8"));
Date time = new java.util.Date(Long.parseLong(upToNCharacters));
// System.out.println(time);
model.setDate(String.valueOf(timeZoneFormat.format(time)));
在需要的地方使用時間變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.