格林尼治标准时间(GMT) UTC时差(小时分钟),无夏时制(DST)

格林尼治标准时间(GMT) UTC时差(小时分钟),无夏时制(DST),第1张

概述格林尼治标准时间(GMT)/ UTC时差(小时/分钟),无夏时制(DST)

我已经看到了与这个问题有关的其他编程语言或 *** 作系统的一些问题/答案,但我没有发现我的具体情况的通用解决scheme。 我想在一个linux shell脚本或纯C中获得给定时区的GMT偏移量(普通标识符如EDT,CET或欧洲/柏林)。

一个简单的解决scheme是:

$ TZ=":Europe/Berlin" date +%z

但是这将打印当前的 GMT偏移量(包括当前正在使用的DST)。

这里有一个更好的例子来展示我的意思:

Java时区已经搞乱了

TIME_ZONE_informatION结构中的Microsoft时区名称是否经过翻译?

蒙得维的亚标准时间AP.NET TimeZoneInfo中的数据不正确

守护进程中的DST更改处理(* NIX)

.Net TimeZoneInfo ID – windows语言特定?

$ TZ=":Europe/Berlin" date +%z --date="1 Jan 2014" +0100 $ TZ=":Europe/Berlin" date +%z --date="1 May 2014" +0200

我需要一个选项来获取任何国家/城市的非DST值(这里:+0100)。

其他问题可以解决我的问题,并与此有关:

如何find一个给定的城市(欧洲/柏林)的正确的非DST时区(Etc / GMT-1)而不知道提前抵消?

您如何知道DST在给定时间戳处于活动状态?

$ TZ=":Europe/Berlin" date --date="2014-01-01" Wed Jan 1 00:00:00 CET 2014 $ TZ=":Europe/Berlin" date --date="2014-05-01" Thu May 1 00:00:00 CEST 2014

CEST(欧洲中部夏令时)和CET(中欧时间)的标识符在世界其他地方可能并不常见,所以如果有人需要,可以select简单得到DST = 1或DST = 0的选项。 通过zdump你可以得到isdst = 0或isdst = 1的所有时间戳改变夏时制,但它不是那么容易使用国际海事组织。

在C ++中错误的时间

如何在git bash中设置正确的本地时区?

.NET环境下的TimeZoneInfo托pipe在unix(Nginx)

如何在windows中使用python更改系统时区?

如何从任何地方在特定的时区find时间

这将以秒为单位返回给定的时区当前年份与GMT之间的非DST偏移量:

zdump -v "Europe/Berlin" | sed ":a;N;$!ba;s/^.*$(echo -n $(date +%Y)) [^ ]* isdst=0 gmtoff=([^n]*)n.*$/1/" 3600

这里发生的事情是,sed匹配zdump为该时区返回的当前第一个非dst行,然后用第一个匹配行的结束替换整个zdump输出,即GMT 。

如果您需要将其格式化为+ HHMM或-HHMM:

offsetArray=($(zdump -v "America/New_York" | sed ":a;N;$!ba;s/^.*$(echo -n $(date +%Y)) [^ ]* isdst=0 gmtoff=(-*)([^n]*)n.*$/1+ 2/")) echo "${offsetArray[0]:0:1}$(date -ud @${offsetArray[1]} +%H%M)" -0500

这将创建一个包含两个元素的数组,即以秒为单位的偏移量的符号和绝对值。 它输出前者,并通过将时间从时间(1970年1月1日00:00:00 UTC / GMT)作为时间通过日期来格式化后者。 由于Bash数组赋值忽略了前导空格,数组的第一个元素实际上是“+”或“ – +”,所显示的是第一个字符(即+或 – )。

顺便说一下,我认为zdump列出的每一年都应该有与GMT相同的非DST偏移量,并且我的原始答案只是在找到第一年的时候抓住了sed,但我编辑了答案以检查当前的年份以适应1901年以来时区发生变化的理论边缘情况。

(可以删除尾部的反斜杠,以便在一行中获得所有的指令,或者在第二个例子中获得两行)。

除非我完全错误地解释你的问题,否则使用给定日期的1月1日作为参考很容易,例如:

TZ=":${city}" date +%z --date="$(date +%Y --date="${date}")-01-01"

示范:

$ cat t.sh #!/bin/bash get_current_modifIEr() { echo $(TZ=":$1" date +%z --date="$2" 2>/dev/null) } get_non_dst_modifIEr() { echo $(TZ=":$1" date +%z --date="$(date +%Y --date="$2")-01-01" 2>/dev/null) } is_dst() { local city=$1 local date=$2 local offset1=$(get_non_dst_modifIEr "${city}" "${date}") local offset2=$(get_current_modifIEr "${city}" "${date}") if [ -z "${offset1}" ] || [ -z "${offset2}" ]; then return 2 fi [ "${offset1}" != "${offset2}" ] } today=$(date +%Y-%m-%d) printf "%-15s %-10s %-5s %-8s %-8sn" CITY DATE 'DST?' 'current' 'non-DST' while read -r city date; do [ -n "${city}" ] || continue is_dst "${city}" "${date}" case $? in 0) is_dst=true ;; 1) is_dst=false ;; 2) is_dst=error ;; esac cur_mod=$(get_current_modifIEr "${city}" "${date}") non_dst=$(get_non_dst_modifIEr "${city}" "${date}") printf "%-15s %-10s %-5s %-8s %-8sn" "${city}" "${date}" "${is_dst}" "${cur_mod}" "${non_dst}" done <<EOT Europe/Berlin $today Europe/Berlin 2014-01-01 US/Alaska $today US/Alaska 2014-01-01 Europe/Moscow $today Europe/Moscow 2014-01-01 EOT

$ ./t.sh CITY DATE DST? current non-DST Europe/Berlin 2014-05-04 true +0200 +0100 Europe/Berlin 2014-01-01 false +0100 +0100 US/Alaska 2014-05-04 true -0800 -0900 US/Alaska 2014-01-01 false -0900 -0900 Europe/Moscow 2014-05-04 false +0400 +0400 Europe/Moscow 2014-01-01 false +0400 +0400

总结

以上是内存溢出为你收集整理的格林尼治标准时间(GMT)/ UTC时差(小时/分钟),无夏时制(DST)全部内容,希望文章能够帮你解决格林尼治标准时间(GMT)/ UTC时差(小时/分钟),无夏时制(DST)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存