由日期字符串+时间字符串+时区偏移字符串创建JavaScript日期对象。

问题描述 投票:0回答:1

我总共有4个不同的输入,即:。

  1. 日期字符串 (2020-05-05)
  2. 时间串 (15:30)
  3. 时区偏移(-09:00)

我想把这些字符串组合成一个日期时间对象,比如(2020-05-05T15:30:00-09:00),不管我的本地浏览器时区是什么。问题是当我把这些字符串组合起来,然后我尝试使用new Date()函数制作日期对象时,我的日期时间被转换为UTC时间戳。

我试了一下。

const date =
  moment(this.actualDateOfSurgeryDate).format(YYYYMMDD) +
  'T' +
  moment(this.actualDateOfSurgeryTimeDropDown + ' ' + this.actualDateOfSurgeryTimeAM_PMDropDown, ['h:mm A']).format('HH:mm:ss') +
  offsetTime;

this.caseDetail.actualDateOfSurgery = new Date(date);

这给我的输出是这样的: 2020-05-05T04:30:00.000Z

如何才能得到我想要的输出。2020-05-05T15:30:00-09:00? 我的项目里有一刻钟js可用

javascript datetime timestamp momentjs
1个回答
1
投票

我想把这些字符串合并到一个日期时间对象中,比如(2020-05-05T15:30:00-09:00)

日期对象极其简单,它们只是一个时间值,是1970-01-01T00:00:00Z以来以毫秒为单位的偏移,所以本质上是UTC。内置的解析器并不可靠,缺乏任何格式标记等功能。

所以如果你有单独的值,比如

  • 日期字符串 (2020 -05 -05)
  • 时间串 (15:30)
  • 时区偏移(-09:00)

那么你就可以创建一个符合格式的字符串。ECMA-262中定义的 并且 被内置的解析器正确解析,例如

new Date('2020-05-05T15:30:00.000-09:00')

然而,由于实现上的差异,一般建议避免使用内置解析器。此外,格式必须准确(例如,在时间戳中包含秒和毫秒,在偏移量中包含冒号(:)),否则一些实现会将其视为格式错误而拒绝,并返回一个无效的日期。

一旦你有了一个Date对象,得到一个带有偏移量的 "本地 "时间戳就是一个格式化的问题,这个问题之前已经回答过很多次了(比如说. 如何格式化一个JavaScript日期). 没有任何像样的内置格式化功能 (带选项的toLocaleString 在某些情况下是可以的,但一般来说功能不足),所以你必须要么 自编函数,或使用一个库。

下面的例子使用了 卢克逊建议使用 moment.js 的升级路径。

在Luxon中,如果你指定了一个有代表性的地点,你就会得到该地点在日期和时间上的偏移量。或者,你可以将偏移量固定为一个设定值,本质上是为一个没有代表位置的时区设定,所以它没有任何参考夏令时或历史偏移量变化。

let DateTime = luxon.DateTime;

// Offset per the specified location
let d0 = DateTime.fromISO('2020-01-01', {zone: 'America/Yakutat'});
let d1 = DateTime.fromISO('2020-06-30', {zone: 'America/Yakutat'});
console.log(d0.toString());
console.log(d1.toString());

// Fixed offset per the supplied string
let d2 = DateTime.fromISO('2020-05-05T15:30:00.000-09:00', { setZone: true});
let d3 = DateTime.fromISO('2020-01-01T15:30:00.000-09:00', { setZone: true});
console.log(d2.toString());
console.log(d3.toString());
  
<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/global/luxon.min.js"></script>

1
投票

我得到16: 30,因为DST

3月之前或10月之后的日期将给予15:30的时间。

let dateString = "2020-05-05"+"T"+"15:30"+":00"+"-09:00"
console.log(dateString)
const date = new Date(dateString)
console.log(date)
const Anchorage = date.toLocaleString('en-US', {timeZone: 'America/Anchorage', hour12: false})
console.log(Anchorage)

let options = {}
options.timeZone = 'America/Anchorage';
options.timeZoneName = 'short';
console.log(date.toLocaleDateString('en-US'), date.toLocaleTimeString('en-US', options));
© www.soinside.com 2019 - 2024. All rights reserved.