从 JS Date 对象中提取时间而不偏移时区

Extract time from JS Date object without offsetting the Time zone

所以我们有多个客户,它们位于多个时区。我从 API 中提取了一些日期,而这个字符串中的 dates/times 正是我需要显示的。我一直在研究这个,并挖掘了一段时间,但仍然没有得出明确的答案。输入的字符串格式如下:

"2017-12-29T20:00:00"

我想要的是将日期和时间按原样提取到两个字符串中(没有时区偏移,无论查看器位于何处)但是在这样做时遇到了一些问题。也希望以正确的方式格式化它。示例:

"M/d/yyyy"
"hh:mm AM/PM" (12 hour)

我已经尝试了很多方法来解决这个问题,我真的不想只获取子字符串,但我有点想这样做。感谢任何帮助。

使用此代码:

function formatAMPM(date) {
  var hours = date.getUTCHours();
  var minutes = date.getUTCMinutes();
  var ampm = hours >= 12 ? 'PM' : 'AM';
  hours = hours % 12;
  hours = hours ? hours : 12; // the hour '0' should be '12'
  minutes = minutes < 10 ? '0'+minutes : minutes;
  var strTime = hours + ':' + minutes + ' ' + ampm;
  return strTime;
}

var str = "2017-12-29T20:00:00";
var dt = new Date(str + "Z");
console.log("M/d/yyyy");
console.log((dt.getUTCMonth() + 1) + '/' + dt.getUTCDate() + '/' +  dt.getUTCFullYear());
console.log("hh:mm AM/PM");
console.log(formatAMPM(dt));

考虑重新格式化字符串,它避免了内置解析器和时区的所有问题:

function reformatTimestamp(s) {
  function z(n){return (n<10?'0':'')+ +n}
  var b = s.split(/\D/);
  var h = b[3]%12 || 12;
  var ap = b[3] < 12? 'AM':'PM';
  return b[1] + '/' + b[2] + '/' + b[0] +
         ' ' + z(h) + ':' + z(b[4]) + ' ' + ap;
}

console.log(reformatTimestamp('2017-12-29T20:00:00')) // 12/29/2017 08:00 PM

我认为用前导零填充月份和日期会更好(但我也会使用明确的日期格式,如 DD-MMM-YYYY,而不是特殊的 m/d/y)。