Подтвердить что ты не робот

Конвертировать эпоху до настоящего времени

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

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

4b9b3361

Ответ 1

EDIT: Хорошо, поэтому вы не хотите, чтобы ваше местное время (а не Австралия) способствовало результату, а вместо этого - в часовом поясе Австралии. Ваш существующий код должен быть абсолютно точным, хотя Сидней в настоящее время 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 даты/времени...

EDIT: обратите внимание, что если ваша система не знает о часовом поясе Australia/Sydney, она будет показывать UTC. Например, если я изменил код для использования TimeZone.getTimeZone("blah/blah"), он дважды отобразит значение UTC. Я предлагаю вам распечатать TimeZone.getTimeZone("Australia/Sydney").getDisplayName() и посмотреть, что он говорит... и проверить свой код для опечаток тоже:)

Ответ 2

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

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(epoch*1000));

Ответ 3

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

Чтобы получить объект даты с ваших миллисов:

    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.