簡體   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