Конструктор даты возвращает NaN в IE, но работает в Firefox и Chrome
Я пытаюсь создать небольшой календарь в JavaScript. У меня хорошие даты в Firefox и Chrome, но в IE функции даты возвращают NaN.
Вот функция:
function buildWeek(dateText){
var headerDates='';
var newDate = new Date(dateText);
for(var d=0;d<7;d++){
headerDates += '<th>' + newDate + '</th>';
newDate.setDate(newDate.getDate()+1);
}
jQuery('div#headerDates').html('<table><tr>'+headerDates+'</tr></table>');
}
dateText
- это понедельник текущей недели, которая фактически установлена в php в формате "m, d, Y", например. "02, 01, 2010"
.
Ответы
Ответ 1
Конструктор Date принимает любое значение. Если примитивный [[значение]] аргумента является числом, то созданная дата имеет это значение. Если primitive [[value]] - String, спецификация гарантирует, что конструктор Date и метод parse способны анализировать результат Date.prototype.toString и Date.prototype.toUTCString()
Надежным способом установки даты является построение одного и использование методов setFullYear
и setTime
.
Пример этого:
http://jibbering.com/faq/#parseDate
ECMA-262 r3 не определяет форматы дат. Передача строковых значений конструктору Date или Date.parse имеет результат, зависящий от реализации. Лучше всего избегать.
Изменить:
Запись из часто задаваемых вопросов в comp.lang.javascript:
Расширенный формат даты ISO 8601 YYYY-MM-DD
можно проанализировать с помощью Date
со следующим: -
/**Parses string formatted as YYYY-MM-DD to a Date object.
* If the supplied string does not match the format, an
* invalid Date (value NaN) is returned.
* @param {string} dateStringInRange format YYYY-MM-DD, with year in
* range of 0000-9999, inclusive.
* @return {Date} Date object representing the string.
*/
function parseISO8601(dateStringInRange) {
var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,
date = new Date(NaN), month,
parts = isoExp.exec(dateStringInRange);
if(parts) {
month = +parts[2];
date.setFullYear(parts[1], month - 1, parts[3]);
if(month != date.getMonth() + 1) {
date.setTime(NaN);
}
}
return date;
}
Ответ 2
Из формата mysql datetime/timestamp:
var dateStr="2011-08-03 09:15:11"; //returned from mysql timestamp/datetime field
var a=dateStr.split(" ");
var d=a[0].split("-");
var t=a[1].split(":");
var date = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]);
Я надеюсь, что это полезно для кого-то.
Работает в IE FF Chrome
Ответ 3
Не используйте "новую дату()", потому что она берет строку ввода даты как локальное время:
new Date('11/08/2010').getTime()-new Date('11/07/2010').getTime(); //90000000
new Date('11/07/2010').getTime()-new Date('11/06/2010').getTime(); //86400000
мы должны использовать "NewDate()", он принимает данные как GMT:
function NewDate(str)
{str=str.split('-');
var date=new Date();
date.setUTCFullYear(str[0], str[1]-1, str[2]);
date.setUTCHours(0, 0, 0, 0);
return date;
}
NewDate('2010-11-07').toGMTString();
NewDate('2010-11-08').toGMTString();
Ответ 4
Здесь другой подход, который добавляет метод к объекту Date
использование: var d = (new Date()).parseISO8601("1971-12-15");
/**
* Parses the ISO 8601 formated date into a date object, ISO 8601 is YYYY-MM-DD
*
* @param {String} date the date as a string eg 1971-12-15
* @returns {Date} Date object representing the date of the supplied string
*/
Date.prototype.parseISO8601 = function(date){
var matches = date.match(/^\s*(\d{4})-(\d{2})-(\d{2})\s*$/);
if(matches){
this.setFullYear(parseInt(matches[1]));
this.setMonth(parseInt(matches[2]) - 1);
this.setDate(parseInt(matches[3]));
}
return this;
};
Ответ 5
Здесь фрагмент кода, который фиксирует это поведение IE
(v ['date'] - дата-строка, разделенная запятой, например "2010,4,1" ):
if($.browser.msie){
$.lst = v['date'].split(',');
$.tmp = new Date(parseInt($.lst[0]),parseInt($.lst[1])-1,parseInt($.lst[2]));
} else {
$.tmp = new Date(v['date']);
}
Предыдущий подход не учитывал, что месяц JS Date основан на ZERO...
Извините, что не слишком много объяснял, я на работе и просто думал, что это может помочь.
Ответ 6
Я всегда храню дату в UTC.
Это моя собственная функция, сделанная из различных функций, которые я нашел на этой странице.
В качестве формата mysql DATETIME требуется STRING (пример: 2013-06-15 15:21:41). Проверка с регулярным выражением является необязательной. Вы можете удалить эту часть, чтобы повысить производительность.
Эта функция возвращает метку времени.
DATETIME рассматривается как дата UTC.
Будьте осторожны: если вы ожидаете локальное время datetime, эта функция не для вас.
function datetimeToTimestamp(datetime)
{
var regDatetime = /^[0-9]{4}-(?:[0]?[0-9]{1}|10|11|12)-(?:[012]?[0-9]{1}|30|31)(?: (?:[01]?[0-9]{1}|20|21|22|23)(?::[0-5]?[0-9]{1})?(?::[0-5]?[0-9]{1})?)?$/;
if(regDatetime.test(datetime) === false)
throw("Wrong format for the param. `Y-m-d H:i:s` expected.");
var a=datetime.split(" ");
var d=a[0].split("-");
var t=a[1].split(":");
var date = new Date();
date.setUTCFullYear(d[0],(d[1]-1),d[2]);
date.setUTCHours(t[0],t[1],t[2], 0);
return date.getTime();
}
Ответ 7
Отправьте текст и формат даты, в которые вы отправляете datetext, следующим способом. Он будет анализировать и возвращать в качестве даты, и это не зависит от браузера.
function cal_parse_internal(val, format) {
val = val + "";
format = format + "";
var i_val = 0;
var i_format = 0;
var x, y;
var now = new Date(dbSysCurrentDate);
var year = now.getYear();
var month = now.getMonth() + 1;
var date = now.getDate();
while (i_format < format.length) {
// Get next token from format string
var c = format.charAt(i_format);
var token = "";
while ((format.charAt(i_format) == c) && (i_format < format.length)) {
token += format.charAt(i_format++);
}
// Extract contents of value based on format token
if (token == "yyyy" || token == "yy" || token == "y") {
if (token == "yyyy") { x = 4; y = 4; }
if (token == "yy") { x = 2; y = 2; }
if (token == "y") { x = 2; y = 4; }
year = _getInt(val, i_val, x, y);
if (year == null) { return 0; }
i_val += year.length;
if (year.length == 2) {
if (year > 70) {
year = 1900 + (year - 0);
} else {
year = 2000 + (year - 0);
}
}
} else if (token == "MMMM") {
month = 0;
for (var i = 0; i < MONTHS_LONG.length; i++) {
var month_name = MONTHS_LONG[i];
if (val.substring(i_val, i_val + month_name.length) == month_name) {
month = i + 1;
i_val += month_name.length;
break;
}
}
if (month < 1 || month > 12) { return 0; }
} else if (token == "MMM") {
month = 0;
for (var i = 0; i < MONTHS_SHORT.length; i++) {
var month_name = MONTHS_SHORT[i];
if (val.substring(i_val, i_val + month_name.length) == month_name) {
month = i + 1;
i_val += month_name.length;
break;
}
}
if (month < 1 || month > 12) { return 0; }
} else if (token == "MM" || token == "M") {
month = _getInt(val, i_val, token.length, 2);
if (month == null || month < 1 || month > 12) { return 0; }
i_val += month.length;
} else if (token == "dd" || token == "d") {
date = _getInt(val, i_val, token.length, 2);
if (date == null || date < 1 || date > 31) { return 0; }
i_val += date.length;
} else {
if (val.substring(i_val, i_val+token.length) != token) {return 0;}
else {i_val += token.length;}
}
}
// If there are any trailing characters left in the value, it doesn't match
if (i_val != val.length) { return 0; }
// Is date valid for month?
if (month == 2) {
// Check for leap year
if ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) { // leap year
if (date > 29) { return false; }
} else {
if (date > 28) { return false; }
}
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
if (date > 30) { return false; }
}
return new Date(year, month - 1, date);
}
Ответ 8
Здесь мой подход:
var parseDate = function(dateArg) {
var dateValues = dateArg.split('-');
var date = new Date(dateValues[0],dateValues[1],dateValues[2]);
return date.format("m/d/Y");
}
замените ('-')
на используемый вами разделитель.
Ответ 9
Конструктор Date в JavaScript нуждается в строке в одном из форматов даты, поддерживаемых методом parse().
По-видимому, формат, который вы указываете, не поддерживается в IE, поэтому вам нужно либо изменить PHP-код, либо разобрать строку вручную в JavaScript.
Ответ 10
Вы можете использовать следующий код для разбора строки даты ISO8601:
function parseISO8601(d) {
var timestamp = d;
if (typeof (d) !== 'number') {
timestamp = Date.parse(d);
}
return new Date(timestamp);
};
Ответ 11
Попробуйте использовать getDate
функцию datepicker
.
$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate")));