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

Понимание часового пояса Etc/GMT

В чем причина того, что Apple использует часовой пояс Etc/GMT, когда они возвращают квитанцию ​​из App Store для подписки на автоматическое возобновление.

Что такое часовой пояс Etc/GMT? Знает ли Java SDK этот часовой пояс? Или мне нужно использовать другие сторонние библиотеки, такие как Joda-Time?

4b9b3361

Ответ 1

Etc/GMT - это не то же самое, что и UTC или GMT. Они представляют один и тот же момент времени только тогда, когда смещение равно 0. Во всех остальных случаях они совершенно разные.

Apple объясняет обозначение здесь.

Цитата прямо из ссылки дает пример:

Мы используем знаки стиля POSIX в именах зон и сокращениях вывода, хотя это и противоположно тому, что ожидают многие. POSIX имеет положительные признаки к западу от Гринвича, но многие ожидают положительные знаки к востоку от Гринвича. Например, TZ = 'Etc/GMT + 4' использует аббревиатура "GMT + 4" и соответствует 4 часам позади UTC (то есть к западу от Гринвича), хотя многие люди ожидали на 4 часа раньше UTC (то есть к востоку от Гринвича).

Ответ 2

Etc/GMT - это просто стандартный способ сказать UTC, GMT, GMT0 или GMT+00:00.

Java JDK понимает все форматы. Вы можете легко увидеть это в действии, выполнив следующие действия:

import java.util.TimeZone;

public class Playground {

    public static void main(String... args) {

        for (String s : TimeZone.getAvailableIDs()) {
            System.out.println(s);
        }
    }
}

Это будет печатать все различные форматы TimeZone, которые может обрабатывать Java JDK:

...
Etc/GMT
Etc/GMT + 0
Etc/GMT-0
Etc/GMT0
Etc/Гринвич
Etc/UCT
Etc/UTC
Etc/Универсальный
...

Ответ 3

При передаче момента времени между часовыми поясами рекомендуется использовать стандарт UTC или GMT (оба они примерно эквивалентны, для большинства целей мы их не различаем). Похоже, что Apple делает именно это.

JDK прекрасно понимает Etc/GMT.

    ZoneId etcGmt = ZoneId.of("Etc/GMT");

JDK использует базу данных tz (ранее известную как база данных Olson; ссылка внизу). Список названий часовых поясов в базе данных находится в другой ссылке внизу. Etc/GMT указан там. Вы заметите, что оно дано как каноническое имя для GMT (есть также некоторые псевдонимы, некоторые текущие и некоторые устаревшие).

Кроме того, моя строка кода, конечно, использует ZoneId из java.time, современный Java-интерфейс даты и времени. Это класс JDK, который вы захотите использовать (есть также старый и плохо спроектированный класс для часовых поясов, который вы не хотите использовать).

Я не думаю, что вы хотели спросить, но для всех, кто заинтересован: JDK также понимает Etc/GMT+0, Etc/GMT+1, Etc/GMT0, Etc/GMT-0, Etc/GMT-1 и т.д. ) так как они тоже есть в базе. И он правильно обрабатывает перевернутый знак, упомянутый в цитате в принятом ответе Дэвида Педена.

связи

Ответ 4

Я предлагаю вам использовать библиотеку Java для квитанций App Store и перестать думать о формате даты.

Добавьте артефакт ( by.dev.madhead.utils.appstore_receipts_validator:model:2.0.0).

Используйте любой HTTP-клиент для вызова App Store и получения ответа (здесь я использую Ktor):

suspend fun verify(receipt: String, password: String): VerifyReceiptResponse {
    val rawResponse = client.post<String> {
        url("https://buy.itunes.apple.com/verifyReceipt")
        contentType(ContentType.Application.Json)
        accept(ContentType.Application.Json)
        body = VerifyReceiptRequest(
                receipt,
                password,
                true
        )
    }
}

Разбери ответ с Джексоном:

val response = objectMapper.readValue(rawResponse)

Теперь вы можете использовать старый добрый Java API для работы с ответом.

Ответ 5

Смещение относительно зоны

Понимаю:

  • Смещение от UTC - это просто количество часов, минут и секунд, опережающих базовую линию UTC или позади UTC.
  • Часовой пояс гораздо больше. Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.

Положительная или отрицательная нумерация

Разные протоколы в разных отраслях различались по своей нумерации: некоторые считали смещения перед UTC положительными числами, в то время как другие использовали отрицательные. Симметрично, некоторые считали смещения за UTC отрицательными, в то время как другие использовали положительные.

В большинстве современных протоколов, которые я видел, таких как ISO 8601, смещения перед UTC (на восток) положительны, а смещения за UTC (на запад) отрицательны. Таким образом, смещения, используемые зонами в Северной и Южной Америке, имеют отрицательные числа, такие как America/Los_Angeles со смещением -07:00 или -08:00 настоящее время (меняется в течение года из-за перехода на летнее время (DST)).

Я предлагаю вам научиться думать об этом способе (справа от UTC положительно, слева от UTC отрицательно) как о мейнстриме, а противоположность - как о незначительном раздражающем отклонении.

Названия часовых поясов обычно имеют формат Continent/Region, например, America/Edmonton, Europe/Paris, Africa/Tunis, Asia/Kolkata и Pacific/Auckland. Смотрите этот список в Википедии (может быть не в курсе). Есть несколько исключений. Имена Etc/GMT… имеют противоположное соглашение плюс/минус:

  • Etc/GMT+1= -01:00 смещение -01:00= один час отстает от UTC
  • Etc/GMT+12= -12:00 смещение -12:00= двенадцать часов после UTC

…а также…

  • Etc/GMT-1= +01:00 смещение +01:00= один час до UTC
  • Etc/GMT-12= +12:00 смещение +12:00= двенадцать часов до UTC

Смешение? Добро пожаловать в дурацкий мир обработки времени и даты. Отсюда становится только страннее.

Ключевые моменты:

  • Понять значение и намерения тех людей, которые публикуют данные. Никогда не принимайте значение входной строки.
  • Используйте классы java.time только для всей вашей работы с датой и временем. Никогда не используйте ужасные унаследованные классы java.util.Date, Calendar, SimpleDateFormat и тому подобное.

К счастью, классы java.time могут помочь вам преодолеть эту путаницу. Смотрите правильный ответ Ole VV, используя класс ZoneId.

Ваши вопросы

обоснование Apple, используя часовой пояс Etc/GMT

Они означают смещение нуля, само UTC. Строка Etc/GMT является одной канонической меткой для смещения от UTC, равного нулю часов, минут и секунд.

Буква Z (произносится как "Зулу"), обычно видимая в конце строки даты и времени, означает то же самое, смещение нуля.

Что такое часовой пояс Etc/GMT?

Строка Etc/GMT - это имя часового пояса, в котором было только одно смещение от UTC, смещение нуля часов, минут и секунд.

Большинство других часовых поясов, таких как Europe/Berlin или Africa/Casablanca, различаются по своей истории. Например, в этой зоне Africa/Casablanca в Марокко в прошлом году политики решили, что вместо того, чтобы переключать один час два раза в год на стандартное время и летнее время, они теперь будут постоянно находиться в режиме летнего времени круглый год. Я говорю "навсегда" со смехом, поскольку это действительно означает "пока политики снова не передумают". Политики во всем мире проявляют склонность к переопределению своих часовых поясов с удивительной частотой.

Java SDK понимает этот часовой пояс?

Да. Смотрите ответ Оле VV: ZoneId.of( "Etc/GMT" )

Или я должен использовать другие сторонние библиотеки, такие как Joda-Time?

К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания, что позволяет перейти на классы java.time. Смотрите Учебник по Oracle.

Вы должны использовать классы java.time для всей вашей обработки даты и времени.