【问题标题】:Get DST/STD dates and times for a given timezone (Javascript)获取给定时区的 DST/STD 日期和时间 (Javascript)
【发布时间】:2017-05-02 11:47:21
【问题描述】:

我正在开发一个包含在 Windows CE 设备中的嵌入式网站。 把它看成是你路由器的网页配置界面。 一切都包含在非常小的内存中,整个网站的每个脚本、html、css 和图标都不到 500KB。

我们必须假设要“浏览”该界面的用户无法访问互联网(仅限 LAN),因此这里没有“在线”解决方案。

我正在寻找一种解决方案,以便用户选择他的时区,代码将获取至少未来 10-20 年的所有 DST/STD 时间和日期,并将它们下载到之后将自动运行的设备,并且在特定日期,将自行将其时间更改为 DST/STD。 当前应用程序是自定义的(与 windowce api 无关)并且需要 DST/STD 日期对

iana.org 正在为世界上的每个位置维护一个数据库。我还看到 moment-timezone(javascript 界面)正在将这些数据“打包”在一个非常紧凑的 25kb 压缩包中。

我需要知道是否有可能:

  1. 从该数据库中“提取”一个主 tz 列表,以便用户可以选择自己的 tz。我查看了他们的文档,但示例无效:

var itsTimeZones = moment.tz.names();

2- 提取所选区域未来 10-20 年的 DST/STD 日期/时间?我在任何地方都没有看到关于这个主题的任何文档。但既然它是这样一个数据库的目的,我会说它一定是埋在那里的某个地方,需要一种方法来挖掘它。

3- 如果时刻时区不是正确的选择,那么任何人都有可以满足该要求的解决方案吗?

谢谢

【问题讨论】:

  • 时区偶尔会改变它们的偏移量,有些地区会更改适用夏令时的规则,有些地区会采用它,有些地区会停止使用它。并非所有人都使用 1 小时偏移量。您只能假设当前的夏令时规则将适用于未来。您需要一个用于偏移量的时区数据库,当它们适用时,IANA 是一个好的开始,moment.js 可能是一个好的解决方案(但不是唯一的)。
  • 您是否排除了将一个小 c# 程序集成到您的应用程序中的可能性?如果没有,Windows CE 已经有一个可用时区列表
  • 没有 C# 带有 .net 紧凑框架(或类似的框架),所以在我们的内存占用方面真的不现实。
  • 你在#1 上所说的“示例不起作用”是什么意思?我保持时刻时区,它工作正常,AFAIK。
  • 另外,您确实意识到,即使我们根据当前规则预测 10 到 20 年的数据 - 规则本身也可能随时更改并且相对经常更改。如果您要求面向未来,那是不可能的。政客为所欲为,我们只能反映他们的选择。

标签: javascript date momentjs windows-ce dst


【解决方案1】:

我从时刻时区提取给定区域的 DST 列表的解决方案。 1. "theTz" 是网页中选择的变化的数字索引。 2. select 填充了“List”。

var itsTz =
{
    "List" : moment.tz.names(), // Get all zone 'Names'
    "Transitions" : [],
};


function TimeZoneChanged(theTz)
{
    var myZone = moment.tz.zone(itsTz.List[theTz]);  // Get zone by its name from List
    var myTime = moment.tz(moment(), myZone.name);   // Start today
    var myResult;

    // Build transition list according to new zone selected
    itsTz.Transitions = [];
    do
    {
        myResult = GetNextTransition(myZone, myTime);

        if(myResult != null)
        {
            itsTz.Transitions.push(moment(myResult).format("YYYY/MM/DD"));
            myTime = moment.tz(myResult, myZone.name);  // Get next from date found
        }
    }while(myResult != null);
}

function GetNextTransition(theZone, theTime)
{
    var myResult;

    for(var i = 0; i < theZone.untils.length; i++) 
    {
        if(theZone.untils[i] > theTime) 
        {
            theZone.untils[i] == Infinity ? myResult = null : myResult = new moment(theZone.untils[i]).format();
            return  myResult;
        }
    }
}

“美国/多伦多”的结果:

2017/03/12, 2017/11/05, 2018/03/11, 2018/11/04, 2019/03/10, 2019/11/03, 2020/03/08, 2020/11/01, 2021/03/14, 2021/11/07, 2022/03/13, 2022/11/06, 2023/03/12, 2023/11/05, 2024/03/10, 2024/11/03, 2025/03/09, 2025/11/02, 2026/03/08, 2026/11/01, 2027/03/14, 2027/11/07, 2028/03/12, 2028/11/05, 2029/03/11, 2029/11/04, 2030/03/10, 2030/11/03, 2031/03/09, 2031/11/02, 2032/03/14, 2032/11/07, 2033/03/13, 2033/11/06, 2034/03/12, 2034/11/05, 2035/03/11, 2035/11/04, 2036/03/09, 2036/11/02, 2037/03/08, 2037 年 11 月 1 日,

【讨论】:

  • “美国/多伦多”的结果:
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2021-12-06
  • 2013-01-24
  • 2013-11-26
相关资源
最近更新 更多