[System Installation] 刚发现一个本地化不彻底的地方。
Tofloor
poster avatar
峡谷训练师
deepin
2023-10-20 05:59
Author

环境变量没有默认设置 TZ=PRC,导致部分浏览器,例如 Microsoft Edge、Firefox 等浏览器使用 UTC 时间,慢了 8 个小时。

哈哈,国产做了这么多年了,居然还有这个遗漏。

Reply Favorite View the author
All Replies
峡谷训练师
deepin
2023-10-20 06:02
#1

我自己手工在 /etc/environment 里面写入 TZ=PRC 后重启电脑,Edge 和 FireFox 的时间都正常了。

Reply View the author
q77190858
deepin
2023-10-20 06:05
#2

原来可以这么解决,学习了

Reply View the author
神末shenmo
deepin
Spark-App
2023-10-20 06:41
#3

这个你把时区改成上海就好了

有些拿着政治大棒的人打了之后默认的时区改成北京了有些网站不认....

图片.png

Reply View the author
hotime
deepin
2023-10-20 07:38
#4

以下是大概整理的一点信息,希望能帮助你了解一点点这个问题。(如果有误,还请指正)


实际上,这是一个关于时区标识符的问题。

因为"Asia/Beijing"目前并不是一个有效的IANA时区标识符(Asia/Shanghai是)。

IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。

比如常用于各类网站服务器的Java语言的日期和时间API中,时区标识符就是基于IANA时区数据库的(当然Java也支持一些类如PRC之类的时区标识符)。例如,Java中的 ZoneId类和 ZonedDateTime类。

ZoneId zoneId = ZoneId.of("Asia/Beijing");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);
// 执行结果会报错,提示:Unknown time-zone ID: Asia/Beijing

比如某个网站为全球各地用户提供服务,时间按照用户当前时区来显示,那么服务器就需要先知道用户当前时区。当获取到"Asia/Beijing"时,IANA时区数据库中没有这个名称对应的时区记录,服务器就不知道用户所在时区是哪个,所以就默认按照UTC时间显示(当然这由网站服务提供方决定)。

很多网站考虑到了这一点,额外增加判断逻辑:如果获取到的是"Asia/Beijing",那就按东八区显示时间,这样就解决了这个问题。但并不是所有的网站都会考虑到这个,所以你会遇到时间看起来未按预期显示。

要从根本上解决这个问题,要么就是国家层面出力,直接和IANA交涉,让其新增时区标识符"Asia/Beijing";要么就是退后一步重新用“Asia/Shanghai”这个不太符合国人习惯的时区标识符,但网站服务器什么都不用改变。(一般而言,我们从小到大应该是经常听到这样的声音“现在是:北京时间九点整~”,而不是“现在是:上海时间九点整~”)

另外虽然“PRC”这个也可以使用,但由于“PRC”不是IANA时区标识符,还是推荐使用“标准”的IANA时区标识符来处理日期和时间。理由如下(来自百度AI):


使用PRC作为时区标识符,在以下情况下可能会失效:

  • 不同操作系统之间的差异:不同的操作系统可能对PRC时区的处理方式不同,例如在Windows系统中,PRC时区有时被处理为"Asia/Shanghai",而在Linux系统中则可能被处理为"Asia/Chongqing"。因此,使用PRC作为时区标识符在不同操作系统中可能存在差异。
  • 不同数据库之间的差异:不同的数据库可能对PRC时区的处理方式不同,例如Oracle数据库中可以使用PRC时区进行时间转换,而其他数据库则可能不支持。因此,使用PRC作为时区标识符在不同数据库中可能存在差异。
  • 不同应用之间的差异:不同的应用可能对PRC时区的处理方式不同,例如在Java应用程序中使用PRC作为时区标识符是可以的,但在某些应用中则可能不支持。因此,使用PRC作为时区标识符在不同应用中可能存在差异。

为了避免因使用PRC作为时区标识符而引起的差异,建议使用标准的IANA时区标识符来处理日期和时间,以确保跨平台的一致性和准确性。


再补充一篇文章的链接:你应该知道的时区知识之通用时区数据库,这篇文章中介绍的挺细致,而且还附带了一些相关链接可以继续了解。

(比如文章里提到的通用时区数据库的源码托管地址,在这个项目中可以找到关于中国各地区时区的相关记录:https://github.com/eggert/tz/blob/main/asia 第272行至1122行,写的准不准确不好说,毕竟部分内容也没有经过政府背书,可以大致看一看略作了解,如果感兴趣的话)

Reply View the author
神末shenmo
deepin
Spark-App
2023-10-20 08:00
#5
hotime

以下是大概整理的一点信息,希望能帮助你了解一点点这个问题。(如果有误,还请指正)


实际上,这是一个关于时区标识符的问题。

因为"Asia/Beijing"目前并不是一个有效的IANA时区标识符(Asia/Shanghai是)。

IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。

比如常用于各类网站服务器的Java语言的日期和时间API中,时区标识符就是基于IANA时区数据库的(当然Java也支持一些类如PRC之类的时区标识符)。例如,Java中的 ZoneId类和 ZonedDateTime类。

ZoneId zoneId = ZoneId.of("Asia/Beijing");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);
// 执行结果会报错,提示:Unknown time-zone ID: Asia/Beijing

比如某个网站为全球各地用户提供服务,时间按照用户当前时区来显示,那么服务器就需要先知道用户当前时区。当获取到"Asia/Beijing"时,IANA时区数据库中没有这个名称对应的时区记录,服务器就不知道用户所在时区是哪个,所以就默认按照UTC时间显示(当然这由网站服务提供方决定)。

很多网站考虑到了这一点,额外增加判断逻辑:如果获取到的是"Asia/Beijing",那就按东八区显示时间,这样就解决了这个问题。但并不是所有的网站都会考虑到这个,所以你会遇到时间看起来未按预期显示。

要从根本上解决这个问题,要么就是国家层面出力,直接和IANA交涉,让其新增时区标识符"Asia/Beijing";要么就是退后一步重新用“Asia/Shanghai”这个不太符合国人习惯的时区标识符,但网站服务器什么都不用改变。(一般而言,我们从小到大应该是经常听到这样的声音“现在是:北京时间九点整~”,而不是“现在是:上海时间九点整~”)

另外虽然“PRC”这个也可以使用,但由于“PRC”不是IANA时区标识符,还是推荐使用“标准”的IANA时区标识符来处理日期和时间。理由如下(来自百度AI):


使用PRC作为时区标识符,在以下情况下可能会失效:

  • 不同操作系统之间的差异:不同的操作系统可能对PRC时区的处理方式不同,例如在Windows系统中,PRC时区有时被处理为"Asia/Shanghai",而在Linux系统中则可能被处理为"Asia/Chongqing"。因此,使用PRC作为时区标识符在不同操作系统中可能存在差异。
  • 不同数据库之间的差异:不同的数据库可能对PRC时区的处理方式不同,例如Oracle数据库中可以使用PRC时区进行时间转换,而其他数据库则可能不支持。因此,使用PRC作为时区标识符在不同数据库中可能存在差异。
  • 不同应用之间的差异:不同的应用可能对PRC时区的处理方式不同,例如在Java应用程序中使用PRC作为时区标识符是可以的,但在某些应用中则可能不支持。因此,使用PRC作为时区标识符在不同应用中可能存在差异。

为了避免因使用PRC作为时区标识符而引起的差异,建议使用标准的IANA时区标识符来处理日期和时间,以确保跨平台的一致性和准确性。


再补充一篇文章的链接:你应该知道的时区知识之通用时区数据库,这篇文章中介绍的挺细致,而且还附带了一些相关链接可以继续了解。

(比如文章里提到的通用时区数据库的源码托管地址,在这个项目中可以找到关于中国各地区时区的相关记录:https://github.com/eggert/tz/blob/main/asia 第272行至1122行,写的准不准确不好说,毕竟部分内容也没有经过政府背书,可以大致看一看略作了解,如果感兴趣的话)

诺,这个就叫专业

Reply View the author
蓝鲸
deepin
2023-10-20 16:37
#6
hotime

以下是大概整理的一点信息,希望能帮助你了解一点点这个问题。(如果有误,还请指正)


实际上,这是一个关于时区标识符的问题。

因为"Asia/Beijing"目前并不是一个有效的IANA时区标识符(Asia/Shanghai是)。

IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。

比如常用于各类网站服务器的Java语言的日期和时间API中,时区标识符就是基于IANA时区数据库的(当然Java也支持一些类如PRC之类的时区标识符)。例如,Java中的 ZoneId类和 ZonedDateTime类。

ZoneId zoneId = ZoneId.of("Asia/Beijing");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);
// 执行结果会报错,提示:Unknown time-zone ID: Asia/Beijing

比如某个网站为全球各地用户提供服务,时间按照用户当前时区来显示,那么服务器就需要先知道用户当前时区。当获取到"Asia/Beijing"时,IANA时区数据库中没有这个名称对应的时区记录,服务器就不知道用户所在时区是哪个,所以就默认按照UTC时间显示(当然这由网站服务提供方决定)。

很多网站考虑到了这一点,额外增加判断逻辑:如果获取到的是"Asia/Beijing",那就按东八区显示时间,这样就解决了这个问题。但并不是所有的网站都会考虑到这个,所以你会遇到时间看起来未按预期显示。

要从根本上解决这个问题,要么就是国家层面出力,直接和IANA交涉,让其新增时区标识符"Asia/Beijing";要么就是退后一步重新用“Asia/Shanghai”这个不太符合国人习惯的时区标识符,但网站服务器什么都不用改变。(一般而言,我们从小到大应该是经常听到这样的声音“现在是:北京时间九点整~”,而不是“现在是:上海时间九点整~”)

另外虽然“PRC”这个也可以使用,但由于“PRC”不是IANA时区标识符,还是推荐使用“标准”的IANA时区标识符来处理日期和时间。理由如下(来自百度AI):


使用PRC作为时区标识符,在以下情况下可能会失效:

  • 不同操作系统之间的差异:不同的操作系统可能对PRC时区的处理方式不同,例如在Windows系统中,PRC时区有时被处理为"Asia/Shanghai",而在Linux系统中则可能被处理为"Asia/Chongqing"。因此,使用PRC作为时区标识符在不同操作系统中可能存在差异。
  • 不同数据库之间的差异:不同的数据库可能对PRC时区的处理方式不同,例如Oracle数据库中可以使用PRC时区进行时间转换,而其他数据库则可能不支持。因此,使用PRC作为时区标识符在不同数据库中可能存在差异。
  • 不同应用之间的差异:不同的应用可能对PRC时区的处理方式不同,例如在Java应用程序中使用PRC作为时区标识符是可以的,但在某些应用中则可能不支持。因此,使用PRC作为时区标识符在不同应用中可能存在差异。

为了避免因使用PRC作为时区标识符而引起的差异,建议使用标准的IANA时区标识符来处理日期和时间,以确保跨平台的一致性和准确性。


再补充一篇文章的链接:你应该知道的时区知识之通用时区数据库,这篇文章中介绍的挺细致,而且还附带了一些相关链接可以继续了解。

(比如文章里提到的通用时区数据库的源码托管地址,在这个项目中可以找到关于中国各地区时区的相关记录:https://github.com/eggert/tz/blob/main/asia 第272行至1122行,写的准不准确不好说,毕竟部分内容也没有经过政府背书,可以大致看一看略作了解,如果感兴趣的话)

太专业了,以前遇到这种情况还不知道怎么处理,这么一讲,全清楚了!kissing_heart

Reply View the author
dgmenghuan
deepin
2023-10-20 16:45
#7

高手太多了

Reply View the author
翻过山峰看见云
deepin
2023-10-20 17:47
#8
hotime

以下是大概整理的一点信息,希望能帮助你了解一点点这个问题。(如果有误,还请指正)


实际上,这是一个关于时区标识符的问题。

因为"Asia/Beijing"目前并不是一个有效的IANA时区标识符(Asia/Shanghai是)。

IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。

比如常用于各类网站服务器的Java语言的日期和时间API中,时区标识符就是基于IANA时区数据库的(当然Java也支持一些类如PRC之类的时区标识符)。例如,Java中的 ZoneId类和 ZonedDateTime类。

ZoneId zoneId = ZoneId.of("Asia/Beijing");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);
// 执行结果会报错,提示:Unknown time-zone ID: Asia/Beijing

比如某个网站为全球各地用户提供服务,时间按照用户当前时区来显示,那么服务器就需要先知道用户当前时区。当获取到"Asia/Beijing"时,IANA时区数据库中没有这个名称对应的时区记录,服务器就不知道用户所在时区是哪个,所以就默认按照UTC时间显示(当然这由网站服务提供方决定)。

很多网站考虑到了这一点,额外增加判断逻辑:如果获取到的是"Asia/Beijing",那就按东八区显示时间,这样就解决了这个问题。但并不是所有的网站都会考虑到这个,所以你会遇到时间看起来未按预期显示。

要从根本上解决这个问题,要么就是国家层面出力,直接和IANA交涉,让其新增时区标识符"Asia/Beijing";要么就是退后一步重新用“Asia/Shanghai”这个不太符合国人习惯的时区标识符,但网站服务器什么都不用改变。(一般而言,我们从小到大应该是经常听到这样的声音“现在是:北京时间九点整~”,而不是“现在是:上海时间九点整~”)

另外虽然“PRC”这个也可以使用,但由于“PRC”不是IANA时区标识符,还是推荐使用“标准”的IANA时区标识符来处理日期和时间。理由如下(来自百度AI):


使用PRC作为时区标识符,在以下情况下可能会失效:

  • 不同操作系统之间的差异:不同的操作系统可能对PRC时区的处理方式不同,例如在Windows系统中,PRC时区有时被处理为"Asia/Shanghai",而在Linux系统中则可能被处理为"Asia/Chongqing"。因此,使用PRC作为时区标识符在不同操作系统中可能存在差异。
  • 不同数据库之间的差异:不同的数据库可能对PRC时区的处理方式不同,例如Oracle数据库中可以使用PRC时区进行时间转换,而其他数据库则可能不支持。因此,使用PRC作为时区标识符在不同数据库中可能存在差异。
  • 不同应用之间的差异:不同的应用可能对PRC时区的处理方式不同,例如在Java应用程序中使用PRC作为时区标识符是可以的,但在某些应用中则可能不支持。因此,使用PRC作为时区标识符在不同应用中可能存在差异。

为了避免因使用PRC作为时区标识符而引起的差异,建议使用标准的IANA时区标识符来处理日期和时间,以确保跨平台的一致性和准确性。


再补充一篇文章的链接:你应该知道的时区知识之通用时区数据库,这篇文章中介绍的挺细致,而且还附带了一些相关链接可以继续了解。

(比如文章里提到的通用时区数据库的源码托管地址,在这个项目中可以找到关于中国各地区时区的相关记录:https://github.com/eggert/tz/blob/main/asia 第272行至1122行,写的准不准确不好说,毕竟部分内容也没有经过政府背书,可以大致看一看略作了解,如果感兴趣的话)

一个很好的科普,时区问题在deepin里也算是一个老生常谈的问题了,但之前的都是讲怎么解决问题,没人讲过这个问题的来龙去脉,涨知识了

Reply View the author
翻过山峰看见云
deepin
2023-10-20 18:06
#9
hotime

以下是大概整理的一点信息,希望能帮助你了解一点点这个问题。(如果有误,还请指正)


实际上,这是一个关于时区标识符的问题。

因为"Asia/Beijing"目前并不是一个有效的IANA时区标识符(Asia/Shanghai是)。

IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。

比如常用于各类网站服务器的Java语言的日期和时间API中,时区标识符就是基于IANA时区数据库的(当然Java也支持一些类如PRC之类的时区标识符)。例如,Java中的 ZoneId类和 ZonedDateTime类。

ZoneId zoneId = ZoneId.of("Asia/Beijing");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);
// 执行结果会报错,提示:Unknown time-zone ID: Asia/Beijing

比如某个网站为全球各地用户提供服务,时间按照用户当前时区来显示,那么服务器就需要先知道用户当前时区。当获取到"Asia/Beijing"时,IANA时区数据库中没有这个名称对应的时区记录,服务器就不知道用户所在时区是哪个,所以就默认按照UTC时间显示(当然这由网站服务提供方决定)。

很多网站考虑到了这一点,额外增加判断逻辑:如果获取到的是"Asia/Beijing",那就按东八区显示时间,这样就解决了这个问题。但并不是所有的网站都会考虑到这个,所以你会遇到时间看起来未按预期显示。

要从根本上解决这个问题,要么就是国家层面出力,直接和IANA交涉,让其新增时区标识符"Asia/Beijing";要么就是退后一步重新用“Asia/Shanghai”这个不太符合国人习惯的时区标识符,但网站服务器什么都不用改变。(一般而言,我们从小到大应该是经常听到这样的声音“现在是:北京时间九点整~”,而不是“现在是:上海时间九点整~”)

另外虽然“PRC”这个也可以使用,但由于“PRC”不是IANA时区标识符,还是推荐使用“标准”的IANA时区标识符来处理日期和时间。理由如下(来自百度AI):


使用PRC作为时区标识符,在以下情况下可能会失效:

  • 不同操作系统之间的差异:不同的操作系统可能对PRC时区的处理方式不同,例如在Windows系统中,PRC时区有时被处理为"Asia/Shanghai",而在Linux系统中则可能被处理为"Asia/Chongqing"。因此,使用PRC作为时区标识符在不同操作系统中可能存在差异。
  • 不同数据库之间的差异:不同的数据库可能对PRC时区的处理方式不同,例如Oracle数据库中可以使用PRC时区进行时间转换,而其他数据库则可能不支持。因此,使用PRC作为时区标识符在不同数据库中可能存在差异。
  • 不同应用之间的差异:不同的应用可能对PRC时区的处理方式不同,例如在Java应用程序中使用PRC作为时区标识符是可以的,但在某些应用中则可能不支持。因此,使用PRC作为时区标识符在不同应用中可能存在差异。

为了避免因使用PRC作为时区标识符而引起的差异,建议使用标准的IANA时区标识符来处理日期和时间,以确保跨平台的一致性和准确性。


再补充一篇文章的链接:你应该知道的时区知识之通用时区数据库,这篇文章中介绍的挺细致,而且还附带了一些相关链接可以继续了解。

(比如文章里提到的通用时区数据库的源码托管地址,在这个项目中可以找到关于中国各地区时区的相关记录:https://github.com/eggert/tz/blob/main/asia 第272行至1122行,写的准不准确不好说,毕竟部分内容也没有经过政府背书,可以大致看一看略作了解,如果感兴趣的话)

刚才去查了下为什么IANA一开始就只收录了Asia/Shanghai而没有收录我们中国人更习惯的Asia/Beijing。以下内容来自讯飞星火:

IANA收录了"Asia/Shanghai"而没有收录"Asia/Beijing"的原因有历史和实际考虑。在1949年以前,中国一共有五个时区,包括哈尔滨(Asia/Harbin)、上海(Asia/Shanghai)、重庆(Asia/Chongqing)、乌鲁木齐(Asia/Urumqi)和喀什(Asia/Kashgar)。 但在现代的时间区数据库TZ database中,城市的选择通常基于人口数量,而在1982年的中国人口普查数据中,上海的人口为1186万,北京的人口为923万,因此上海被选为代表城市。

此外,从国际标准的角度来看,北京和上海处于同一时区,只能保留一个代表。同时,上海作为经济和文化中心,其代表性已经得到了广泛的认可,因此维护者没有足够的动力做出改变。 这就是为什么我们会看到"Asia/Shanghai"而没有"Asia/Beijing"的原因。

Reply View the author
hotime
deepin
2023-10-20 18:42
#10
翻过山峰看见云

刚才去查了下为什么IANA一开始就只收录了Asia/Shanghai而没有收录我们中国人更习惯的Asia/Beijing。以下内容来自讯飞星火:

IANA收录了"Asia/Shanghai"而没有收录"Asia/Beijing"的原因有历史和实际考虑。在1949年以前,中国一共有五个时区,包括哈尔滨(Asia/Harbin)、上海(Asia/Shanghai)、重庆(Asia/Chongqing)、乌鲁木齐(Asia/Urumqi)和喀什(Asia/Kashgar)。 但在现代的时间区数据库TZ database中,城市的选择通常基于人口数量,而在1982年的中国人口普查数据中,上海的人口为1186万,北京的人口为923万,因此上海被选为代表城市。

此外,从国际标准的角度来看,北京和上海处于同一时区,只能保留一个代表。同时,上海作为经济和文化中心,其代表性已经得到了广泛的认可,因此维护者没有足够的动力做出改变。 这就是为什么我们会看到"Asia/Shanghai"而没有"Asia/Beijing"的原因。

因此维护者没有足够的动力做出改变

确实啊,所以我才感觉,只有由国家推动才有可能处理这样的问题,当然并不是说要删掉Asia/Shanghai,但新增Asia/Beijing还是可以做到的。

Reply View the author
deepin_xiaoqian
deepin testing team
2023-10-20 19:35
#11

给楼上的所有评论都点个赞like

针对这个问题,我们在下个版本会进行优化

Reply View the author