将当前时间转换为WebKit/Chrome17位时间戳Javascript(我在Python中有答案)

Convert current time to WebKit/Chrome 17-digit timestamp in Javascript (I have the answer in Python)

我需要将 JS 当前时间转换成 WebKit/Chrome 17 位时间戳,这里是 Python 中的代码(我需要在 Javascript 中)

def date_to_webkit(date_string):
    epoch_start = datetime(1601, 1, 1)
    date_ = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
    diff = date_ - epoch_start
    seconds_in_day = 60 * 60 * 24
    return '{:<017d}'.format(
        diff.days * seconds_in_day + diff.seconds + diff.microseconds)

# Date string to Webkit timestamp
date_to_webkit('2016-08-24 10:35:47')  # 13116508547000000

这是来自这个回复

我已将给定的 Python 代码转换为 JS。

function date_to_webkit(date_string) {
  epoch_start = new Date(1601, 0, 1);
  date_ = new Date(date_string);
  diff = Math.abs(date_ - epoch_start) * 1000;
  return diff;
}
date_string = "2016-08-24 10:35:47";
webkit_string = date_to_webkit(date_string);
console.log(webkit_string);

输出:

13116508547000000

免责声明:它通过了给定的测试用例。应该检查不同的时区和不同的日期。

PHP代码的文字转换也意味着手动解析字符串。 ECMA-262 不支持 OP 时间戳格式,因此使用内置解析器进行解析是依赖于实现的,至少一种常见的浏览器会将其视为无效。所以应该根据 PHP 代码手动解析它。

解析'2016-08-24 10:35:47'不会return所有系统的相同时间值,因为没有偏移量意味着它将被解析为本地,因此解析的值将因当地时区偏移而异。

根据链接的答案,纪元是 1601 年 1 月 1 日 00:00 UTC,这将是一个常数 (-11644473600000),因此无需每次都计算它。

代码的优化版本是:

function date_to_webkit(date_string) {
  // Parse input timestamp
  let [Y, M, D, H, m, s] = date_string.split(/\W/);
  // Treat timestamp values as local
  // 11644421940000 is the epoch offset constant
  return (new Date(Y, M-1, D, H, m, s).getTime() + 11644421940000) * 1e3;
}

// Convert webkit/Chrome time value to Date
function webkit_to_date(tv) {
  return new Date((tv / 1000) - 11644421940000);
}

let date = '2016-08-24 10:35:47';
let tv = date_to_webkit(date);

console.log('Start date string : ' + date +
          '\nDate as time value: ' + tv +
          '\nTime value as Date: ' + webkit_to_date(tv).toLocaleString('en-CA'));