了解Etc / GMT时区

时间:2011-09-05 03:07:55

标签: java iphone timezone app-store jodatime

当Apple从App Store返回自动续订订阅的收据时,Apple使用Etc / GMT时区的理由是什么。

Etc / GMT时区到底是什么时候? Java SDK是否了解此时区?或者我是否必须使用其他第三方库,如Joda-Time

4 个答案:

答案 0 :(得分:18)

Etc / GMT 与UTC或GMT严格相同。它们仅在偏移量为0时表示相同的瞬间。在所有其他情况下,它们是完全不同的。

Apple解释了here这个名称。

直接来自链接的引用给出了一个例子:

  

我们在区域名称和输出缩写中使用POSIX样式的符号,   即使这与许多人的期望相反。   POSIX在格林威治以西有积极的迹象,但很多人都期望   格林威治以东的积极迹象。例如,TZ ='Etc / GMT + 4'使用   缩写“GMT + 4”,相当于UTC后4小时   (即格林威治以西)即使很多人都希望如此   意味着比UTC早4小时(即格林威治以东)。

答案 1 :(得分:7)

Etc/GMT只是说UTCGMTGMT0GMT+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);
        }
    }
}

这将打印出Java JDK可以解析的所有不同TimeZone格式:

  

...
  ETC / GMT
  其他/ GMT + 0
  ETC / GMT-0
  ETC / GMT0
  ETC /格林威治
  ETC / UCT
  ETC / UTC
  ETC /通用
  ...

答案 2 :(得分:1)

偏移量与区域

了解:

  • offset-from-UTC只是在UTC基线之前或UTC之后数小时-数分钟-秒。
  • time zone还要很多。时区是特定地区人民过去,现在和将来对偏移量的更改的历史记录。

正数与负数

各个行业中不同的协议在编号上有所不同,一些协议将UTC的 ahead 抵消为正数,而另一些则将其为负数。对称地,有些人认为UTC后面的偏移量是负值,而其他人则使用正数。

在我见过的大多数现代协议中,例如ISO 8601,UTC(向东)之前的偏移为正,而UTC(向西)之后的偏移为负。因此,美洲地区使用的偏移量为负数,例如America/Los_Angeles如今的偏移量为-07:00-08:00(由于Daylight Saving Time (DST),一年中的变化)。

我建议您学会将这种方式(UTC的右为正,UTC的左为负)视为主流,将其视为次要的讨厌变化。

时区名称通常采用Continent/Region格式,例如America/EdmontonEurope/ParisAfrica/TunisAsia/KolkataPacific/Auckland。请参阅此list on Wikipedia(可能不是最新的)。有一些例外。 Etc/GMT…名称带有相反的加/减约定:

  • Etc/GMT+1 = -01:00偏移量=格林尼治标准时间落后一小时
  • Etc/GMT+12 = -12:00偏移量=格林尼治标准时间12小时

…和…

  • Etc/GMT-1 = +01:00偏移量= UTC前一小时
  • Etc/GMT-12 = +12:00偏移量=格林尼治标准时间(UTC)之前十二小时

令人困惑?欢迎来到日期时间处理的古怪世界。从这里只会变得奇怪。

要点:

  • 了解发布数据的人的含义和意图。永远不要假设输入字符串的含义。
  • 仅将 java.time 类用于所有日期时间工作。切勿使用可怕的旧类java.util.DateCalendarSimpleDateFormat等。

幸运的是, java.time 类可以帮助您解决这一难题。使用ZoneId类查看correct Answer by Ole V.V.

您的问题

  

使用Etc / GMT时区落后于Apple的合理销售

它们表示UTC本身的零偏移。字符串Etc/GMT是一个相对于UTC的偏移量为零时分三秒的规范标签。

在日期时间字符串末尾常见的字母Z(发音为“ Zulu”)表示同一意思,偏移量为零。

  

Etc / GMT时区到底是什么?

字符串Etc/GMT是一个时区的名称,该时区只有一个相对于UTC的偏移量,零时分-秒-秒。

大多数其他时区,例如Europe/BerlinAfrica/Casablanca在历史上的偏移也有所不同。例如,在that Africa/Casablanca zone in Morocco中,政客们去年决定,与其将标准时间和夏令时(DST)每年两次切换为一个小时,现在他们将全年永久保留夏令时。我笑着“永久”地说,因为那真的意味着“直到政客们再次改变主意”。世界各地的政界人士都表现出了以惊人的频率重新定义其时区的偏好。

  

Java SDK是否了解该时区?

是的。参见Ole V.V的the AnswerZoneId.of( "Etc/GMT" )

  

还是我必须使用其他第三方库,例如Joda-Time?

仅供参考,Joda-Time项目现在位于maintenance mode中,建议迁移到java.time类。参见Tutorial by Oracle

您应该使用 java.time 类进行所有日期时间处理。

答案 3 :(得分:0)

我建议您使用Java library作为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
        )
    }
}

用Jackson解析响应:

val response = objectMapper.readValue(rawResponse)

现在,您可以使用普通的旧Java API来处理响应。