javascript - 谁能解释为什么我的日期函数通过 JS 日期对象给我一个错误的转换?

标签 javascript date

抱歉,如果标题不能很好地解释我的问题。

我的脚本中遇到一个奇怪的问题,在初始阶段,我将日期字符串转换为毫秒,然后在脚本中,它被转换回清晰的日期格式。给我带来问题的日期字符串是那些具有常规日期但也附加了小时的字符串。这是一个例子:

legitDate = function (date) {

    var months = ['01', '02', '03', '04', '05', '06',
                  '07', '08', '09', '10', '11', '12'];

    return months[date.getUTCMonth()] + "/" + date.getUTCDate() + "/" + date.getUTCFullYear()
}

var init = Date.parse("1/27/2016  7:00:00 PM");
var ayy = new Date(init);
var result = legitDate(ayy);

最终结果为 1/28/2016,而不是最初的 1/27/2016。我不知道为什么会发生这种转变。

最佳答案

不要使用 Date 构造函数(或 Date.parse,它们做同样的事情)来解析字符串。 ECMA-262 中指定的唯一格式是 ISO 8601 的子集,并非所有使用的浏览器都支持该格式,并且在某些地方两者不一致。 OP 中的格式与 ISO 8601 不一致,因此解析完全依赖于实现。

始终手动解析字符串。库可以提供帮助,但为特定格式编写解析器并不难。

要根据主机时区偏移(即“本地”)解析类似“1/27/2016 7:00:00 PM”的字符串,请考虑以下将缺失值视为零并验证结果日期:

// Parse string in 1/27/2016  7:00:00 PM format
// Missing time values are treated as zero
// If any value is invalid, returns an invalid date (time value NaN)
function parseDate(s) {
  var b = s.match(/\d+/g) || [];
  var hr = (/pm\s*/.test(s)? 12 :0) + (+b[3] || 0);
  var d = new Date(b[2], --b[0], b[1], hr, (b[4]||0), (b[5]||0));

  // Validate the generated date against input values
  return d && d.getMonth() == b[0] && (b[3] || 0) < 13 &&
         d.getMinutes() == (b[4] || 0)? d : new Date(NaN);
}

['1/27/2016  7:00:00 PM',
 '2/29/2016 12:45:15 am',
 '6/31/2016 12:45:15 am', // invalid date
 '2/29/2016 13:45:15 am', // invalid hours
 '2/29/2016 06:45am'    , // missing seconds
 '2/29/2016'              // missing time asssumed as 00:00:00
].forEach(function(s) {
  document.write(parseDate(s) + '<br>');
});

关于javascript - 谁能解释为什么我的日期函数通过 JS 日期对象给我一个错误的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676055/

相关文章:

19-1-1 到 1900-01-01 的 Ruby Date.strftime 格式日期不起作用

javascript - 比较从函数生成的日期对象和

ios - 日期格式崩溃

javascript - Cordova 文件插件 FileReader.readAsText 获取错误但不调用错误回调

javascript - 如何从 div 内的表创建数据表 gridview

SQLite 日期 "is greater than other date"例如 '25/09/2014' 不起作用

javascript - 将 json 回调数据转换为日期

javascript - 这是什么意思? "Failed to load resource: the server responded with a status of 405 (Method Not Allowed)"

javascript - VueJs 中全局加载的数据有时为 null

javascript - 如何将现有回调 API 转换为 Promise?