[英]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.