Javascript Cordova WP8 上的日期构造函数

Javascript date constructor on Cordova WP8

我有一个 28-Dec-2016 04:25 AM 格式的日期字符串,需要将其转换为 Date 对象。为此,我首先拆分字符串以获取日期和时间

cDateStringParts = cdate.split(' ');

然后我得到日期和时间组件

cDateParts = cDateStringParts[0].split('-');
cTimeParts = cDateStringParts[1].split(':');

然后我将 Date 对象初始化为

if(cDateStringParts[2]=='AM'){
    cDateObject = new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]), cDateParts[0], cTimeParts[0], cTimeParts[1], 0, 0);
} else {
    cDateObject = new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]), cDateParts[0], complaintTimeParts[0] + 12, cTimeParts[1], 0, 0);
}

其中 convertToNumericMonth() 是一个将 Jan-Dec 转换为 0-11.But 的函数 我在检查 cDateObject.getDate()/getMonth()/getYear() 时没有得到正确的值。结果是2017/12/29.

我做错了什么?如果我尝试做 alert(cdate,' ',cDateObject.getFullYear() 我得到这个:

This link 可能是您问题的解决方案。

您实际上不能依赖日期解析,因为它取决于时区、夏令时等多种因素。

您还可以检查设备的时区和时间设置,因为浏览器使用系统数据来解析日期。

我在我的浏览器上检查了相同的逻辑,它对我来说工作正常。

这是例子。

如果它以这种方式工作,问题将是 cDateParts 计算的值生成不同的值(可能性非常小)。

希望对您有所帮助。

一个问题是如何将 12 小时制转换为 24 小时制。日期部分是字符串,因此对于“03:45 PM”如下:

complaintTimeParts[0] + 12

将return“0312”。此外,“12:00 AM”应将小时数设置为 0,但您的代码会将小时数设置为 12。

小时可以转换为 24 小时制,方法是先转换为数字,将 12am 转换为 0,如果是 PM,则加 12。如果与其余计算分开进行,也会更简单:

var hr = cTimeParts[0] % 12 + (cDateStringParts[2]=='AM'? 0 : 12);

此处 mod 运算符 % 会将 cTimeParts[0] 转换为数字。现在函数可以是:

function dateParse(cdate) {
  var cDateStringParts = cdate.split(' ');
  var cDateParts = cDateStringParts[0].split('-');
  var cTimeParts = cDateStringParts[1].split(':');
  var hr = cTimeParts[0] % 12 + (cDateStringParts[2]=='AM'? 0 : 12);
  return new Date(cDateParts[2], convertToNumericMonth(cDateParts[1]),
                  cDateParts[0], hr, cTimeParts[1]);
}

function convertToNumericMonth(month) {
  return {Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,
          Aug:7,Sep:8,Oct:9,Nov:10,Dec:11}[month];
}

console.log(dateParse('28-Dec-2016 04:25 AM').toString());
console.log(dateParse('28-Dec-2016 04:25 PM').toString());

最后,缺少的部分设置为 0(或日期为 1),因此不需要包括在内。