javascript - 使用 DST 设置获取 JavaScript 时区字符串
问题描述
语境
我在 ESP8266 上运行 Web 服务器,并希望在设备上实现自动 DST。目前我正在从客户端获取时间设置。我使用的是 ESP8266 SDK 而不是 Arduino。
信息流
Web 服务器没有互联网连接,只有 WiFi。
|Web 服务器|<---->|WiFi|<---->|客户端|<---->|互联网|
打算如何发送 TZ 字符串。
|网络服务器|<--|WiFi|<--|客户端|
客户端可以是任何可以运行现代浏览器的东西。
问题
有没有办法使用 JavaScript 从客户端以以下格式获取 DST 设置?
标准偏移 dst [偏移],开始[/时间],结束[/时间]
我可以使用以下方法获取时区字符串:
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,M3.5.5/2,M10.5.0/2
设置TZ 验证。如果我用变量timeinfo.tm_isdst
设置 TZ只是保持在 0。也用相同的结果进行测试。Asia/Jerusalem
timeinfo.tm_isdst
America/New_York
参考
我不使用“几乎相同的用例”的原因是因为我在 ram 和存储方面严重不足,无法在 Web 服务器上存储大型 C 字符串。
解决方案
最可靠的解决方案是将时间作为纪元时间戳发送,并使用 JavaScript 将其转换为本地时间。
也就是说,如果您安装tz 数据库的副本,则每个区域文件的最后一次是 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
db 的大小约为 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
推荐阅读
- r - 在 r 中创建与 df 不同的数组
- sql - ElasticSearch 等价于 SQL “WHERE (condition1 OR (condition2 AND condition3))”
- sql - UNPIVOT 假期时间
- wordpress - Wordpress 站点运行状况无法读取未定义的属性“applyFilters”
- reactjs - 自定义钩子没有正确使用 useState()?
- c - 全局变量不升级(c语言)
- html - MVC 页面模型的提交列表项以在 Post 方法中使用
- ios - 如何使用模拟器分享我的 iphone 应用程序仍然 ind 开发
- bootstrap-4 - Bootstrap 4 - 对齐
- python - 带有命名空间的 XML 到 Pandas DF - Python