获取给定时区的DST / STD日期和时间(Javascript)

时间:2016-12-16 16:19:52

标签: javascript date momentjs windows-ce dst

我正在开发一个包含在Windows CE设备中的嵌入式网站。 将其视为路由器的Web配置界面。 一切都包含在一个非常小的内存中,整个网站的每个脚本,HTML,CSS和图标都不到500KB。

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

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

iana.org正在为世界上的每个地方维护一个数据库。我还看到,时间 - 时区(javascript界面​​)将这些数据“封装”在一个非常紧凑的25kb压缩包中。

我需要知道是否可以:

  1. 从此DB中“提取”主tz列表,以便用户可以选择自己的tz。我查看了他们的文档,但示例没有用:
  2. var itsTimeZones = moment.tz.names();

    2-提取所选区域的未来10 - 20年DST / STD日期/时间?我没有在这个主题的任何地方看到任何文档。但是因为它是这种数据库的目的,我想说它必须在某处埋葬,需要一种方法来挖掘它。

    3-如果时刻时区不合适,那么任何人都有满足这一要求的解决方案吗?

    Thanxs

1 个答案:

答案 0 :(得分:0)

我的解决方案,用于从时刻区域提取给定区域的DST列表。 1.&#34; theTz&#34;是来自网页中选择的更改的数字索引。 2. select使用&#34; List&#34;。

填充
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年3月12日, 2017年11月5日, 2018年3月11日, 2018年11月4日, 2019年3月10日, 2019年11月3日, 2020年3月8日, 2020年11月1日, 2021年3月14日, 2021年11月7日, 2022年3月13日, 2022年11月6日, 2023年3月12日, 2023年11月5日, 2024年3月10日, 2024年11月3日, 2025年3月9日, 2025年11月2日, 2026年3月8日, 2026年11月1日, 2027年3月14日, 2027年11月7日, 2028年3月12日, 2028年11月5日, 2029年3月11日, 2029年11月4日, 2030年3月10日, 2030年11月3日, 2031年3月9日, 2031年11月2日, 2032年3月14日, 2032年11月7日, 2033年3月13日, 2033年11月6日, 2034年3月12日, 2034年11月5日, 2035年3月11日, 2035年11月4日, 2036年3月9日, 2036年11月2日, 2037年3月8日, 2037年11月1日,