Я пытаюсь создать небольшой календарь на 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"
.
javascript
internet-explorer
date
педальпет
источник
источник
for(var d=0;d';
это вызоветSyntaxError
...Ответы:
Конструктор Date принимает любое значение. Если примитив [[значение]] аргумента - число, то созданная дата имеет это значение. Если примитив [[value]] равен String, тогда спецификация гарантирует только то, что конструктор Date и метод синтаксического анализа способны анализировать результат 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
может быть преобразован в aDate
со следующим: -/**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; }
источник
if (month != date.getMonth() + 1)
утверждение, казалось бы, действительное значение , что делает дату недействительной. Например,2014-06-01T01:09:22.68
. Вы можете объяснить цель этогоif
заявления?Из формата даты и времени / отметки времени mysql:
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
источник
const a = dateStr.split(' '); const d = a[0].split('-'); const t = a[1].split(':'); currentValue.created_date = new Date(+d[0], (+d[1] - 1), +d[2], +t[0], +t[1]);
для ES5 или лучше.Не используйте «new Date ()», потому что он принимает строку даты ввода как местное время:
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();
источник
Вот еще один подход, который добавляет метод к
Date
объектуПрименение:
var d = (new Date()).parseISO8601("1971-12-15");
источник
Я всегда храню дату в формате UTC.
Это моя собственная функция, созданная из различных функций, которые я нашел на этой странице.
Он принимает STRING как формат DATETIME mysql (пример: 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(); }
источник
Вот фрагмент кода, который исправляет такое поведение 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 ...
Извините, что не объясняю слишком много, я на работе и просто подумал, что это может помочь.
источник
Вот мой подход:
var parseDate = function(dateArg) { var dateValues = dateArg.split('-'); var date = new Date(dateValues[0],dateValues[1],dateValues[2]); return date.format("m/d/Y"); }
замените
('-')
на используемый вами разделитель.источник
Отправьте текст даты и формат, в котором вы отправляете текст даты, в методе ниже. Он будет анализировать и возвращать дату, и это не зависит от браузера.
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); }
источник
Конструктору Date в JavaScript нужна строка в одном из форматов даты, поддерживаемых методом parse ().
По-видимому, указанный формат не поддерживается в IE, поэтому вам нужно будет либо изменить код PHP, либо вручную проанализировать строку в JavaScript.
источник
Вы можете использовать следующий код для анализа строки даты ISO8601:
function parseISO8601(d) { var timestamp = d; if (typeof (d) !== 'number') { timestamp = Date.parse(d); } return new Date(timestamp); };
источник
Попробуйте использовать
getDate
функциюdatepicker
.$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate")));
источник
Я попробовал все вышеперечисленные решения, но у меня ничего не помогло. Я провел мозговой штурм и нашел это, и он отлично работал в IE11.
value="2020-08-10 05:22:44.0"; var date=new Date(value.replace(" ","T")).$format("d/m/yy h:i:s"); console.log(date);
если $ format не работает, используйте только формат.
источник