Конвертировать эпоху до настоящего времени
Я пробовал миллион различных способов сделать это, но безрезультатно. Любая помощь приветствуется.
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
Ответы
Ответ 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
.