我从天气api获取了纽约的时间戳utc,想显示纽约的当前时间,但它给出的输出类似于``UTC Sun Dec 01 2019 05:00:00 GMT + 0530(India Standard Time)''。 请参阅代码以供参考
// Code 1
//I get timestamp_utc when console.log(data)
//timestamp_utc: "2019-12-01T05:00:00"
const utc = new Date(data.timestamp_utc)
console.log('UTC', utc)
// UTC Sun Dec 01 2019 05:00:00 GMT+0530 (India Standard Time)
// Code 2
// Another code for getting current time but, failed
var usaTime = new Date().toLocaleString("en-US", {timeZone: timezone}); // Here timezone is from props
console.log('USA time: '+usaTime) // USA time: 12/1/2019, 4:59:58 AM
我也有从Weather API获取的时区数据。我的目标是根据时区或utc时间戳获取当前时间。如您所见,我的两个尝试均未成功。预期输出是下午6:39,现在是纽约时间。有什么好的解决办法吗?
答案 0 :(得分:0)
让我从您的“代码2”开始。这与您编写的内容相同,但时区已填写...
const timezone = "America/New_York";
const usaTime = new Date().toLocaleString( "en-US", { timeZone: timezone});
console.log( 'usaTime =', usaTime );
对我来说这可行。我得到了美国正确格式的NY当前时间。我不确定您的为什么不起作用,但是我不知道您为时区字符串指定了什么。
我也对您的“代码1”感到困惑。您创建的'new Date()'将转换为字符串,然后由console.log语句打印,但这将导致ISO 8601字符串,并且您似乎正在获取语言环境字符串(日期格式)。
答案 1 :(得分:0)
尽管您给出的示例字符串为ISO 8601格式,但它不是显式UTC,因为它不以Z
结尾,也不以诸如+00:00
的时区偏移量结尾。因此,当您使用Date
构造函数进行解析时,它将被解释为本地时间。您可以自己添加Z
(假设timestamp_utc
字段始终是该格式的字符串)来解决此问题:
// timestamp_utc: "2019-12-01T05:00:00"
const utc = new Date(data.timestamp_utc + 'Z'); // adding the Z forces parsing as UTC
现在您有一个Date
对象。但是,如果仅将其传递给console.log
,则看到的输出将取决于实现。您将以与致电toString
相同的格式来查看当地时间,或者会以与致电toISOString
所获得的格式一样的UTC时间。
要获取其他时区的时间,现在您可以调用toLocaleString
并传递timeZone
选项。这假设时区是有效的IANA时区标识符,并且代码运行的环境完全支持ECMAScript国际化规范(ECMA-402)的时区功能。大多数现代浏览器确实确实存在这种情况,但是在较旧的浏览器(例如Internet Explorer)中,您将无法获得正确的输出。
const usEasternTime = utc.toLocaleString("en-US", {timeZone: 'America/New_York'});
最后,从您的变量名usaTime
开始,我认为您可能是在假设美国只有一个时区,但事实并非如此。您将需要传递正确的时区标识符。参见the list on Wikipedia。
答案 2 :(得分:-1)
定义起点($ sourceDate)和终点(进行转换)的时区。
$sourceTimeZone = 'utc';
$targetTimeZone = 'America/Bogota';
使用“ m / d / y h:m:s”格式分隔起源日期的各个组成部分。
list($month, $day, $year, $hours, $minutes, $seconds) = sscanf($sourceDate, "%d/%d/%d %d:%d:%f");
构建DateTime对象,指示其所在的日期和时区。
$datetime = new DateTime("{$year}-{$month}-{$day} {$hours}:{$minutes}:{$seconds}",
new DateTimeZone($sourceTimeZone));
将DateTime的时区修改为目标时区。
$datetime -> setTimezone(new DateTimeZone($targetTimeZone));
获取具有修改后的时区的新日期的组成部分。
list($month2, $day2, $year2, $hours2, $minutes2, $seconds2) = sscanf($datetime -> format(‘m/d/Y H:i:s’), “%d/%d/%d %d:%d:%f”);
显示日期。
echo "En {$sourceTimeZone}: {$day}/{$month}/{$year} {$hours}:{$minutes}:{$seconds}<br/>";
echo "En {$targetTimeZone}: {$day2}/{$month2}/{$year2} {$hours2}:{$minutes2}:{$seconds2}<br/>";
PD:对于JavaScript,这可以帮助您Convert time to different timezone with jQuery