J'essaie de construire un petit calendrier en JavaScript. Mes dates fonctionnent parfaitement dans Firefox et Chrome, mais dans IE, les fonctions de date renvoient NaN.
Voici la fonction:
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
est le lundi de la semaine en cours qui est actuellement défini en php au format 'm, d, Y', par exemple "02, 01, 2010"
.
Le constructeur Date accepte n'importe quelle valeur. Si la primitive [[valeur]] de l'argument est numérique, la date créée a cette valeur. Si la primitive [[valeur]] est String, la spécification garantit uniquement que le constructeur Date et la méthode d'analyse sont capables d'analyser le résultat de Date.prototype.toString et Date.prototype.toUTCString ().
Un moyen fiable de définir une date consiste à en construire une et à utiliser les méthodes setFullYear
et setTime
.
Un exemple de cela apparaît ici: http://jibbering.com/faq/#parseDate
L’ECMA-262 r3 ne définit aucun format de date. Le passage de valeurs de chaîne au constructeur Date ou à Date.parse a un résultat dépendant de l'implémentation. Il vaut mieux éviter.
YYYY-MM-DD
peut être analysé en une Date
comme suit: -/**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;
}
A partir d'un format 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]);
J'espère que c'est utile pour quelqu'un . Fonctionne dans IE FF Chrome
N'utilisez pas "new Date ()", car il prend la chaîne de date d'entrée en heure locale:
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
nous devrions utiliser "NewDate ()", cela prend l'entrée comme heure 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();
Voici une autre approche qui ajoute une méthode à l'objet Date
utilisation: var d = (new Date()).parseISO8601("1971-12-15");
/** * Analyse la date formatée ISO 8601 dans un objet de date. ISO 8601 est AAAA-MM-JJ * * @param {String} date la date sous forme de chaîne, par exemple 1971-12-15 * @returns {Date} Objet Date représentant la date de la chaîne fournie */ Date.prototype.parseISO8601 = function (date) { var correspond = date.match (/ ^\s * (\ d {4}) - (\ d {2}) - (\ d {2})\s * $ /); si (correspond à) { this.setFullYear (parseInt (correspond à [1])); this.setMonth (parseInt (correspond à [2]) - 1); this.setDate (parseInt (correspond à [3])); } retournez ceci; };
Je stocke toujours ma date à l'heure UTC.
Ceci est ma propre fonction faite des différentes fonctions que j'ai trouvées dans cette page.
Il faut un STRING au format mysql DATETIME (exemple: 2013-06-15 15:21:41). La vérification avec la regex est facultative. Vous pouvez supprimer cette partie pour améliorer les performances.
Cette fonction renvoie un horodatage.
La DATETIME est considérée comme une date UTC . Attention: Si vous attendez une date/heure locale, cette fonction ne vous convient pas.
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();
}
Voici un extrait de code qui corrige le comportement d’IE (V ['date'] est une chaîne de date séparée par des virgules, par exemple «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']);
}
L’approche précédente ne considérait pas que JS Date month était basé sur ZERO ...
Désolé de ne pas avoir trop expliqué, je suis au travail et j'ai juste pensé que cela pourrait aider.
Voici mon approche:
var parseDate = function(dateArg) {
var dateValues = dateArg.split('-');
var date = new Date(dateValues[0],dateValues[1],dateValues[2]);
return date.format("m/d/Y");
}
remplacez ('-')
par le délimiteur que vous utilisez.
Envoyez le texte de la date et le format dans lesquels vous envoyez le texte de la méthode ci-dessous. Il va analyser et retourner comme date et cela est indépendant du navigateur.
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);
}
Vous pouvez utiliser le code suivant pour analyser la chaîne de date ISO8601:
function parseISO8601(d) {
var timestamp = d;
if (typeof (d) !== 'number') {
timestamp = Date.parse(d);
}
return new Date(timestamp);
};
Le constructeur Date en JavaScript nécessite une chaîne dans l’un des formats de date pris en charge par la méthode parse ().
Apparemment, le format que vous spécifiez n'est pas pris en charge dans IE. Vous devez donc modifier le code PHP ou analyser la chaîne manuellement en JavaScript.
Essayez d’utiliser la fonction getDate
de datepicker
.
$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate")));