конвертировать время эпохи в дату - PullRequest
18 голосов
/ 12 октября 2011

Я пробовал миллион разных способов сделать это, но безрезультатно.Любая помощь приветствуется.

long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String formatted = format.format(date);

Вышеописанное не работает.

По сути, я хочу получить время эпохи и преобразовать его в австралийское время.Мое местное время +05.30, но, конечно, я не хочу, чтобы это было фактором, который способствует этому преобразованию.

EDIT-

Вывод, когда я запускаю ваш точный код,

эпоха 1318388699000

Ср. 12 октября 08:34:59 GMT + 05: 30 2011

12/10/2011 03:04:59

12/10 / 2011 14: 04: 59

Ответы [ 3 ]

27 голосов
/ 12 октября 2011

РЕДАКТИРОВАТЬ: Хорошо, так что вы не хотите, чтобы ваше местное время (не Австралия) способствовало получению результата, а вместо этого - австралийский часовой пояс.Ваш существующий код должен быть абсолютно нормальным, хотя Сидней в настоящее время имеет UTC + 11 , а не UTC + 10 .. Короткое, но полное тестовое приложение:

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Date date = new Date(1318386508000L);
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String formatted = format.format(date);
        System.out.println(formatted);
        format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
        formatted = format.format(date);
        System.out.println(formatted);
    }
}

Вывод:

12/10/2011 02:28:28
12/10/2011 13:28:28

Я бы также посоветовал вам начать использовать Joda Time , который является просто намного более приятным API даты / времени ...

РЕДАКТИРОВАТЬ: обратите внимание, что если ваша система не знаето Australia/Sydney часовом поясе, будет показывать UTC.Например, если я изменю код для использования TimeZone.getTimeZone("blah/blah"), он покажет значение UTC дважды.Я предлагаю вам напечатать TimeZone.getTimeZone("Australia/Sydney").getDisplayName() и посмотреть, что там написано ... и проверить свой код на наличие опечаток:)

9 голосов
/ 16 июня 2015

Обратите внимание, что время эпохи указано в секундах, а объект Date принимает значение Long, которое указывается в миллисекундах.Следовательно, вам придется умножить значение эпохи на 1000, чтобы использовать его как длинное значение.Как ниже: -

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(epoch*1000));
6 голосов
/ 12 июня 2017

Вот современный ответ (действует с 2014 года и далее).Принятый ответ был очень хорошим ответом в 2011 году. В эти дни я рекомендую, чтобы никто не использовал классы Date, DateFormat и SimpleDateFormat.Все это становится более естественным с современным API даты и времени Java.

Чтобы получить объект даты и времени из вашего millis:

    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("Australia/Sydney"));

Если millis равно 1318388699000L, этодает вам 2011-10-12T14:04:59+11:00[Australia/Sydney].Если код каким-то странным образом окажется на JVM, которая не знает часового пояса Австралии / Сиднея, вы можете быть уверены, что получите уведомление через исключение.

Если вы хотите, чтобы в вашей строке была дата-времяформат для представления:

String formatted = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));

Результат:

12/10/2011 14:04:59

PS Я не знаю, что вы подразумеваете под «вышеописанным не работает». На моем компьютере ваш код вВопрос тоже печатает 12/10/2011 14:04:59.

...