使用DST设置获取JavaScript时区字符串

上下文

我正在ESP8266上运行Web服务器,并想在设备上实现自动DST。目前,我正在从客户端获取时间设置。我使用的是ESP8266 SDK,而不是Arduino。

信息流

Web服务器没有Internet连接,只有WiFi。

| Web服务器| | WiFi | |客户端| |互联网|

如何发送TZ字符串。

| Web服务器|

客户端可以是任何可以运行现代浏览器的东西。

问题

是否可以使用JavaScript通过以下格式从客户端获取DST设置?

  

std offset dst [offset],开始[/ time],结束[/ time]

我可以使用以下方法获取时区字符串:

Intl.DateTimeFormat().resolvedOptions().timeZone

我正在使用的当前系统不支持该格式。

  

:字符

Witch是以上JavaScript返回的格式。如果我没记错的话。

代码

time_t now =0;
struct tm timeinfo;
setenv("TZ","IST-2IDT,M3.5.5/2,M10.5.0/2",1);
tzset();

timeinfo.tm_sec =   sec;
timeinfo.tm_min =   min;
timeinfo.tm_hour =  hour;
timeinfo.tm_mday =  date;
timeinfo.tm_mon =   mon;
timeinfo.tm_year =  year + 100;
timeinfo.tm_wday =  weekd;

//set the time manually
now = mktime(&timeinfo);

if(now < 0){
 //handle error
 ESP_LOGE(__func__,"Time error");

}else{
 localtime_r(&now,&timeinfo);
 //print tm_isdst value
 ESP_LOGW(__func__,"DST is active %d",timeinfo.tm_isdst);

 char strftime_buf[64];
 strftime(strftime_buf,sizeof(strftime_buf),"%c",&timeinfo);
 //print time str
 ESP_LOGI(__func__,"The current date/time: %s",strftime_buf);
}

问题

如果我将IST-2IDT,M10.5.0/2设置为可用的TZ,则timeinfo.tm_isdst变量会在预期的日期和时间发生变化。如果我用Asia/Jerusalem设置TZ,则timeinfo.tm_isdst变量仅保持为0。还用America/New_York进行了测试,结果相同。

参考

TZ-Variable

Almost Identical Use Case

我之所以不使用'Almost Identical Use Case'的原因是,我的ram和存储器严重不足,无法在Web服务器上存储大型C字符串。

sothis2000 回答:使用DST设置获取JavaScript时区字符串

最可靠的解决方案是将时间作为纪元时间戳发送,并使用JavaScript将其转换为本地时间。


也就是说,如果您安装tz database的副本,则每个区域文件的最后一次是POSIX TZ字符串(可能为空)。

当然,您不能指望它在与当前年份不同的年份中是准确的,但这似乎是您想要的。

$ tail -n 1 /usr/share/zoneinfo/Asia/Jerusalem
IST-2IDT,M3.4.4/26,M10.5.0

$ tail -n 1 /usr/share/zoneinfo/America/New_York
EST5EDT,M3.2.0,M11.1.0

数据库大小约为3.5 MiB,但您可以在将其放入设备之前轻松提取所需的信息。以下将产生约60 KiB的输出。

perl -e'
   use strict;
   use warnings;
   use feature qw( say );

   use File::Find::Rule    qw( );
   use IPC::System::Simple qw( capturex );

   my ($db) = @ARGV
     or die("usage\n");

   for my $tz (File::Find::Rule->relative->file->in($db)) {
      my $posix = capturex("tail",-n => 1,"--","$db/$tz");
      chomp($posix);
      say join "\t",$tz,$posix;
   }
' /usr/share/zoneinfo
本文链接:https://www.f2er.com/2917399.html

大家都在问