如何在JS中将结果从toLocaleString方法转换为秒 尽可能远离localeStrings 不要这样做改为执行此操作

问题描述

var d = new Date("sep 01,2020 01:59:59");
var c = d.toLocaleString('de-DE',{timeZone: 'CET'});
console.log(c); // 31.8.2020,17:59:59

我需要将变量c转换为毫秒,就像getTime()方法对Date对象所做的那样。如何做到这一点?

解决方法

尽可能远离localeStrings

它们很难看并且很难编程。老实说,对基础日期对象进行所有处理,并使用ISO日期字符串对所有文本进行存储。无论如何,如果有人在逼迫您的情况下强迫您接收localeString,请让Javascript为您解释如下。

var d = new Date("sep 01,2020 01:59:59");
var c = d.toLocaleString('de-DE',{timeZone: 'CET'});

var sensibleFormat = new Date(c)
var milliseconds = sensibleFormat.getTime()
console.log(milliseconds)

鉴于您在上面的澄清(“我必须将时区更改为CET”),您是否提到CET是因为您想从CET中定义的某个固定时间算起毫秒?

如果您指定一个正确的数字答案示例,您的问题将容易得多。

,

不要这样做

OP尝试进行的操作存在很多问题,首先是d.toLocaleString('de-DE',{timeZone: 'CET'})

  1. ECMA-262不支持该格式,因此解析取决于实现,并且可能会或可能不会按预期进行解析
  2. 即使解析正确,也会假定主机系统偏移,因此对于每个具有不同偏移的系统,它将代表不同的时间

另请参见Why does Date.parse give incorrect results?

new Date('31.8.2020,17:59:59')有问题:

  1. 未指定确切的输出格式,因此实现可以自由地将语言“ de-DE”转换为他们认为匹配的任何格式
  2. 生成的任何格式都不需要生成它的实现来解析,更不用说其他实现了。例如。给定let DateTime = luxon.DateTime; // Timestamp to parse let s = 'sep 01,2020 01:59:59'; // Format of input timestamp let fIn = 'MMM dd,yyyy HH:mm:ss'; // Location to use to determine offset when parsing let loc = 'Europe/Paris'; let d = DateTime.fromFormat(s,fIn,{zone: loc}); // Show date using Luxon default format console.log(d); // "2020-09-01T01:59:59.000+02:00" // Show date in set format let fOut = 'dd.MM.yyyy,HH:mm:ss ZZ'; console.log(d.toFormat(fOut)); // 01.09.2020,01:59:59 +02:00 // UNIX timestamp in seconds console.log(d.toFormat('X')); // 1598918399的Safari和Firefox返回无效的日期
  3. 字符串中可能不包含时区,因此与上面的#2一样会出现同样的问题。

改为执行此操作

一种合理的方法是对字符串使用其他解析器并关联所需的时区(库可以通过将其添加到字符串中或将其指定为选项来提供极大的帮助)。这样应该会生成一个合适的日期,并提供一种获取时间值的方法,该时间值以毫秒为单位,因此可以通过除以1000转换为秒。

在没有库的情况下执行此操作的唯一方法是弄乱Intl.DateTimeFormat以确定偏移量,然后手动应用偏移量(按this anwer)。使用像Luxon这样的库要简单得多:

<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/1.24.1/luxon.min.js"></script>
//main.dart
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),);
  }
}

您可以对其他库执行相同的操作,Luxon只是一个方便的示例。请注意,使用Luxon后,一旦将位置与对象相关联,它将继续使用该位置获取偏移量和时区数据,这可能会方便或令人讨厌,具体取决于您要执行的操作。