2016-12-29 3 views
3

У меня есть строка даты в формате 28-Dec-2016 04:25 AM и ее необходимо преобразовать в объект Date. Для этого я сначала разбить строку, чтобы получить дату и времяКонструктор даты Javascript на Cordova WP8

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. Но я не получаю правильные значения, когда я проверяю cDateObject.getDate()/getMonth()/getYear(). Результат - 2017/12/29.

Что я делаю неправильно? Если я пытаюсь сделать alert(cdate,' ',cDateObject.getFullYear() я получаю это:

enter image description here

+0

Каков результат? –

+0

за 28-Dec-2016 Я получаю 2017/12/29 – Sumit

+0

Я не уверен, но это может быть вопрос часового пояса –

ответ

1

Одна проблема заключается в том, как время в 12 часов преобразуется в 24 часа. Части даты являются строками, так что для "03:45 PM" следующее:

complaintTimeParts[0] + 12 

вернется "0312". Кроме того, «12:00 AM» должен установить часы на 0, но ваш код установит часы на 12.

Часы могут быть преобразованы в 24 часа времени, сначала преобразуя их в число, преобразуя 12am в 0 и затем добавьте 12, если это PM. Также проще, если сделано отдельно от остальной части расчета:

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

Здесь мод оператор % преобразует 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 на дату), поэтому они не должны быть включены.

0

This link может быть решением для вашей проблемы.

вы не можете на самом деле полагаться на дату разбора, потому что она зависит от множества факторов, таких как часовых поясов, летнее и т.д.

можно также проверить настройки часового пояса и времени вашего устройства, потому что, браузер использует данные системы для даты синтаксического анализа.

Я проверил ту же логику в своем браузере, и это сработало для меня.

вот пример.

AM example

PM example

, если она работает таким образом, этот вопрос будет то, что значения, вычисленные cDateParts генерирует различные значения (очень меньше возможности).

надеюсь, что это вам поможет.

+0

Он работает таким образом, но если мое время в PM, я добавляю от 12 до часов, что создает проблему. – Sumit

+0

@ Считайте, что я не уверен, почему он не работает правильно .. его работа как шарм на моем компьютере –