获取带有DST设置的JavaScript时区字符串
上下文 我正在ESP8266上运行一个web服务器,希望在设备上实现自动DST。目前,我正在从客户端获取时间设置。我使用的是ESP8266 SDK,而不是Arduino 信息流 web服务器没有internet连接,只有WiFi |网络服务器| | WiFi | |客户端| |互联网| 您打算如何发送TZ字符串获取带有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字符串(
|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