【问题标题】:How to get a TimeZone ID from a TimeStamp Value如何从时间戳值中获取时区 ID
【发布时间】:2026-01-12 18:05:01
【问题描述】:

是否可以从某个 TimeStamp 获取 TimeZone ID?如果是请用简单的代码解释一下。

 private String getDate(long timeStamp) {DateFormat objFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    TimeZone timeZone = TimeZone.getTimeZone("GMT+4:30");
    //Instead of the Above code I want to get the TimeZone ID from my timeStamp objFormatter.setTimeZone(timeZone);
    Calendar objCalendar =
            Calendar.getInstance(timeZone);
    objCalendar.setTimeInMillis(timeStamp * 1000);
    String result = objFormatter.format(objCalendar.getTime());
    objCalendar.clear();
    return result;
}

【问题讨论】:

  • 它的重复问题。已经被问过很多次了。仅供参考,请检查此答案:*.com/a/1707934/631803
  • 我的问题不可重复。我有一个long timeStamp,我想从中获取 TimeZone。事实上,在任何地方都没有提到 timeStamp,因此这不是一个重复的问题。
  • 然后正确解释你的问题。半信息总是危险的。还提供代码sn-p,你试过的。
  • TimeZone ID's in Java的可能重复
  • @VicJordan 您可以随意将其标记为重复。它不是 !正如我之前所说,我想从 long timestamp 获取 TimeZone ID

标签: java date time timestamp


【解决方案1】:

tl;博士

不可能从 UTC 时间的计数中得出偏移量/区域。但是你可以将调整成一个区域。

Instant.ofEpochSecond( yourCount )
       .atZone( ZoneId.of( "Pacific/Auckland" ) ) 

避免从纪元开始计数

首先,避免使用从纪元开始计数的数字来跟踪日期时间值。你的意思是整秒、毫秒、微秒、纳秒还是其他什么?您是指1970-01-01T00:00:00Z 中的Unix/Java epoch 还是许多计算机系统使用的couple dozen other epochs 之一?

显然你有整秒钟的时间,我假设是 Unix/Java 时代。

无法从 count-from-epoch 获取区域

您不能“从某个 TimeStamp 获取 TimeZone ID”,这是不可能的。您的时代计数是在考虑某个时区时进行的,通常是UTC。如果必须知道用于创建从纪元开始计数的预期区域,则无法推断。

也许您的目标实际上是将此计数调整为特定地区时区的日期时间。继续阅读。

java.time

避免麻烦的旧日期时间类,例如 DateCalendar 现在被 java.time 类取代。

将您的从纪元计数转换为 UTC 时间线上的一个点。

Instant instant = Instant.ofEpochSecond( yourCount ) ;

指定您想要的时区。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kabul" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

看到这个code run live at IdeOne.com

注意 4.5 小时的差异,从 02:40 变为 07:10,这与喀布尔的时间相适应。这是同一时刻,时区的同一点,但从不同地区的挂钟时间的角度来看。

输入:1500000000

即时:2017-07-14T02:40:00Z

zdt: 2017-07-14T07:10+04:30[亚洲/喀布尔]

【讨论】:

  • 谢谢。这是对我的问题的非常透彻和有帮助的答案。正是我需要的。我正在从网站读取时间戳,该网站根据发送 http 请求的用户的位置更改时间戳。我想在我的应用程序中有那个时间戳并从中获取 timeZone。由于我的用户可能使用代理访问该网站,如果我可以读取时间戳并从中获取位置会很方便,但正如你所说的那样,这是不可能的。
  • 我使用 http 请求将网站获取到我的应用程序中,然后我从网站上读取了时间戳,但我无法判断 TimeZone 可能是什么,因为用户可能会在他/她的手机。
  • 网站根据用户的http请求计算TimeStamp。由于我在我的应用程序中发送 http 请求,有没有办法获取用户的当前时区?不是来自他/她的手机,而是来自 http 请求。
【解决方案2】:

我想根据每个术语的定义来回答这个问题。

什么是时间戳?

时间戳或 Unix 时间戳是自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数减去从那时起发生的闰秒数。 Wikipedia

Wath 是时区吗?

时区是使用相同标准时间的地球区域。每个时区由一个标识符描述,通常具有区域/城市(亚洲/东京)格式和格林威治/UTC 时间的偏移量。例如,东京的偏移量是 +09:00。 Time Zone Oracle Doc

关于这两种定义,没有办法根据秒数(时间)来获得地球的区域,因此必须知道时间来自地球的哪个区域。

【讨论】: