Как использовать DateTime и Unix время в Java? - PullRequest
1 голос
/ 28 февраля 2020

Я делаю заявку на Android в Android Studio с Java. Я работаю с датами и временем. Я пытаюсь создать отметку времени Unix из заданного момента времени. Например, следующий фрагмент кода

LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZoneId zoneId = ZoneId.systemDefault();
int x = Math.toIntExact(aDateTime.atZone(zoneId).toEpochSecond());

создает отметку времени Unix 1619760600. Однако, когда я ввожу это в любой онлайн-конвертер, он генерирует время 04/30/2021 @ 5:30am (UTC). Это на 3 hours отличается от исходного введенного времени, которое является точной суммой в часах, в которой мой часовой пояс отличается от UTC00:00.

. Кажется, проблема в моей неспособности понять часовые пояса в Java. Итак, мой вопрос: как правильно рассчитать часовой пояс, чтобы получить правильный UnixTimeStamp?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

У вас уже есть правильная метка времени.

Метки времени представляют моменты времени. Часовые пояса имеют значение только тогда, когда вы хотите отобразить метку времени в местном времени пользователя. В вашем случае 04/30/2021 @ 5:30 (UT C) - это тот же момент времени, что и 8:30 по местному времени. Посмотрите, может ли найденный вами онлайн-инструмент отображать временную метку в вашем местном времени в дополнение к UT C.

Вы должны прекратить использовать int для временной метки и использовать вместо нее long https://en.m.wikipedia.org/wiki/Year_2038_problem

Если вы ожидали создать метку времени для 8:30 UT C вместо 8:30 по местному времени, просто используйте часовой пояс UT C при создании зонированной даты и времени:

LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZoneId zoneId = ZoneOffset.UTC;
long x = aDateTime.atZone(zoneId).toEpochSecond();
0 голосов
/ 28 февраля 2020

Сделайте это следующим образом:

import java.time.LocalDateTime;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
        ZoneId zoneIdUTC = ZoneId.of("UTC");
        ZoneId myZoneId = ZoneId.systemDefault();
        LocalDateTime bDateTime = aDateTime.atZone(zoneIdUTC).withZoneSameInstant(myZoneId).toLocalDateTime();
        System.out.println(bDateTime.atZone(myZoneId).toEpochSecond());
    }
}

Вывод:

1619771400

Попробуйте в https://www.unixtimestamp.com/index.php

enter image description here

0 голосов
/ 28 февраля 2020

Вы можете воспользоваться java.time API (при условии, что вы используете Java 8). Вот пример, взяв предоставленную вами информацию:

LocalDateTime localDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZonedDateTime zdt = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
long millis = zdt.toInstant().toEpochMilli();

Вы можете найти больше информации здесь . Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...