LocalDateTime для IST (индийское стандартное время) с ZoneOffset более чистым способом - PullRequest
1 голос
/ 18 января 2020
private static int gmtOffet = 19800;

public long convertToLong(LocalDateTime localDateTime) {
    return localDateTime.toInstant(ZoneOffset.ofTotalSeconds(gmtOffet)).toEpochMilli();
}

Здесь я рассчитал явное смещение зоны, которое для Индии составляет 5 ч 30 м. Затем преобразуется в секунды и используется для получения местного времени в миллисекундах. Есть ли лучший способ сделать это, когда мне не нужно вычислять смещение по времени, но некоторые enum et c выбирают смещение?

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Если вам нужны миллисекунды начиная с эпохи, наиболее практично получить их от Instant, как вы делаете.

Что касается смещения, то оно чище и лучше получить его из библиотеки:

private static final ZoneId zone = ZoneId.of("Asia/Kolkata");

public long convertToLong(LocalDateTime localDateTime) {
    return localDateTime.atZone(zone).toInstant().toEpochMilli();
}

Это объясняет, почему вы используете смещение. Это также доказательство для исторических c дат (Индия не всегда использовала смещение +05: 30) и будущих дат, если индийские политики примут решение о другом смещении в будущем.

Вы можете спросить себя еще раз, действительно ли вам нужно это значение в миллисекундах? Это низкий уровень. Лучше представлять момент времени как Instant объект или другой объект даты и времени. Разумеется, если это устаревший API вне вашего контроля, у вас нет выбора.

1 голос
/ 18 января 2020

Мгновенно не уместен, во-первых, правда. Секунды (как, например, бит секунд с часами, с удаленными минутами и т. Д.) - это концепция человеческого времени. Instant для компьютерного времени, а LocalDate, ZonedDateTime et c для людей с их сумасшедшими махинациями с часовыми поясами и високосными годами и високосными секундами, русскими революциями и календарями и совершенно астрономически неуместными и необоснованными понятиями, такими как недель. Люди сумасшедшие!

ZoneId INDIA_ZONE = ZoneId.of("Asia/Kolkata");
ZonedDateTime zdt = yourLDT.atZone(INDIA_ZONE);
int seconds = zdt.getSecond();

и так далее.

...