获取带有DST设置的JavaScript时区字符串

获取带有DST设置的JavaScript时区字符串,javascript,c,timezone,embedded,dst,Javascript,C,Timezone,Embedded,Dst,上下文 我正在ESP8266上运行一个web服务器,希望在设备上实现自动DST。目前,我正在从客户端获取时间设置。我使用的是ESP8266 SDK,而不是Arduino 信息流 web服务器没有internet连接,只有WiFi |网络服务器| | WiFi | |客户端| |互联网| 您打算如何发送TZ字符串 |Web服务器|最可靠的解决方案是将时间作为历元时间戳发送,并使用JavaScript将其转换为本地时间 也就是说,如果安装了的副本,则每个区域文件的最后一次是POSIX TZ字符串(

上下文

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

信息流

web服务器没有internet连接,只有WiFi

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

您打算如何发送TZ字符串


|Web服务器|最可靠的解决方案是将时间作为历元时间戳发送,并使用JavaScript将其转换为本地时间


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

当然,你不能指望它能准确地表示与当前年份不同的年份的日期,但它似乎是你想要的

$tail-n1/usr/share/zoneinfo/Asia/耶路撒冷
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
db的大小约为3.5 MiB,但在将其放置到设备上之前,您可以轻松提取所需的信息。以下步骤产生约60千磅的输出

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

为什么你想知道它是否是DST?它提供了历史信息,所以
亚洲/耶路撒冷
美国/纽约
要比
标准偏移量DST[offset]、开始时间、结束时间]
好得多,后者只在“现在”有效。时区信息一直在变化(而且它将继续发生,看看有多少地方正在摆脱DST)。@ikegami。将代码推广到多个区域(简言之)。如果我可以使用
亚洲/耶路撒冷
美国/纽约
形成tz数据库字符串,我会,但正如我在将字符串提供给web服务器(ESP8266)时所说,它会被忽略(就像没有时区字符串一样)。其想法是使用最有可能具有最新dst设置的桌面/服务器客户端来设置设备。如果时区信息发生变化,那么用户/客户端将不得不再次传递数据。您似乎没有抓住要点。没有“最新的dst设置”(假设您是指设置的
std offset dst[offset],start[/time],end[/time]
),因为设置取决于应用它的日期时间的年份。更重要的一点是,您应该添加对tz数据库的支持,而不是尝试获取“设置”从tz数据库名称中,0.3.5Mb太大。在总共4Mb的时刻,只剩下2Mb的空闲空间。我用的是微控制器。是的,
tail
输出正是我想要的。
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);
}
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