繁体   English   中英

java中如何将时间戳转换为日期格式

[英]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;
}

如何将此时间戳转换为日期格式?

直接解析成 OffsetDateTime

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM