gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:08:24 25 4
gpt4 key购买 nike

上下文

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

信息流

网络服务器没有互联网连接,只有 WiFi。

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

打算如何发送 TZ 字符串。

|网络服务器|<--|WiFi|<--|客户端|

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

问题

有没有办法使用 JavaScript 从客户端获取以下格式的 DST 设置?

std offset dst [offset],start[/time],end[/time]

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

Intl.DateTimeFormat().resolvedOptions().timeZone

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

:characters

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 变量会在预期日期发生变化,并且次。如果我使用 Asia/Jerusalem 设置 TZ,则 timeinfo.tm_isdst 变量将保持为 0。还使用 America/New_York 进行测试,结果相同。

引用

TZ-Variable

Almost Identical Use Case

我不使用“Almost Identical Use Case”的原因' 是因为我的内存和存储空间严重不足,无法在 Web 服务器上存储大型 C 字符串。

最佳答案

最可靠的解决方案是将时间作为纪元时间戳发送,并使用 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

关于javascript - 获取带有 DST 设置的 JavaScript 时区字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com