with parseexact moment invalid javascript date safari

javascript - parseexact - Fecha inválida en safari



javascript datetime format (13)

¿Qué tal secuestro Date con Date fix-date ? Sin dependencias, min + gzip = 280 B

alert(new Date(''2010-11-29''));

chrome, ff no tiene problemas con esto, pero safari grita "fecha inválida". Por qué ?

editar: ok, según los comentarios a continuación, utilicé el análisis sintáctico de cadenas e intenté esto:

alert(new Date(''11-29-2010'')); //doesn''t work in safari alert(new Date(''29-11-2010'')); //doesn''t work in safari alert(new Date(''2010-29-11'')); //doesn''t work in safari

editar 22 de marzo de 2018 : Parece que la gente sigue aterrizando aquí. Hoy utilizaría el moment o la date-fns y terminaré con eso. Date-fns es muy libre de dolor y ligero también.


Aunque es posible que espere que los navegadores admitan ISO 8601 (o subconjuntos de fecha solamente), este no es el caso. Todos los navegadores que conozco (al menos en las configuraciones regionales de EE. UU. / Inglés que uso) son capaces de analizar el horrible formato MM/DD/YYYY EE. UU.

Si ya tiene las partes de la fecha, puede intentar usar Date.UTC() . Si no lo hace, pero debe usar el YYYY-MM-DD , le sugiero usar una expresión regular para analizar las piezas que conoce y luego pasarlas a Date.UTC() .


El mismo problema que enfrenta Safari y se solucionó al insertar esto en la página web

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>

Espero que funcione también tu caso también

Gracias


El patrón yyyy-MM-dd no es un formato compatible oficialmente para el constructor de Date . Parece que Firefox lo admite, pero no cuenta con que otros navegadores hagan lo mismo.

Estas son algunas de las cadenas compatibles, tomadas de este sitio :

  • MM-dd-aaaa
  • aaaa / MM / dd
  • MM / dd / aaaa
  • MMMM dd, aaaa
  • MMM dd, aaaa

DateJS parece una buena biblioteca para analizar formatos de fecha no estándar.

Editar : acaba de comprobar el estándar ECMA-262 . Citando de la sección 15.9.1.15:

Formato de fecha y hora

ECMAScript define un formato de intercambio de cadenas para fechas y horas basado en una simplificación del formato extendido ISO 8601. El formato es el siguiente: AAAA-MM-DDTHH: mm: ss.sssZ Donde los campos son los siguientes:

  • YYYY son los dígitos decimales del año en el calendario gregoriano.
  • "-" (hyphon) aparece literalmente dos veces en la cadena.
  • MM es el mes del año desde 01 (enero) a 12 (diciembre).
  • DD es el día del mes de 01 a 31.
  • "T" aparece literalmente en la cadena, para indicar el comienzo del elemento de tiempo.
  • HH es la cantidad de horas completas que han transcurrido desde la medianoche como dos dígitos decimales.
  • ":" (dos puntos) aparece literalmente dos veces en la cadena.
  • mm es la cantidad de minutos completos desde el comienzo de la hora en dos dígitos decimales.
  • ss es el número de segundos completos desde el comienzo del minuto como dos dígitos decimales.
  • "." (punto) aparece literalmente en la cadena.
  • sss es la cantidad de milisegundos completos desde el comienzo del segundo como tres dígitos decimales. Ambos "." y el campo milisegundos puede omitirse.
  • Z es el desplazamiento de zona horaria especificado como "Z" (para UTC) o bien "+" o "-" seguido de una expresión de tiempo hh: mm

Este formato incluye formularios de solo fecha:

  • YYYY
  • YYYY-MM
  • AAAA-MM-DD

También incluye formularios de solo tiempo con un desplazamiento de zona horaria opcional adjunto:

  • THH: mm
  • THH: mm: ss
  • THH: mm: ss.sss

También se incluyen los "horarios" que pueden ser cualquier combinación de los anteriores.

Por lo tanto, parece que AAAA-MM-DD está incluido en el estándar, pero por alguna razón, Safari no lo admite.

Actualización : después de mirar la documentación de datejs , usándola, su problema debe ser resuelto usando un código como este:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy"); var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy"); var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd"); var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");


Estaba enfrentando un problema similar. Date.Parse ("DATESTRING") estaba trabajando en Chrome (Versión 59.0.3071.115) pero no en Safari (Versión 10.1.1 (11603.2.5))

Safari:

Date.parse("2017-01-22 11:57:00") NaN

Cromo:

Date.parse("2017-01-22 11:57:00") 1485115020000

La solución que funcionó para mí fue reemplazar el espacio en dateString con "T". (ejemplo: dateString.replace (/ / g, "T"))

Safari:

Date.parse("2017-01-22T11:57:00") 1485086220000

Cromo:

Date.parse("2017-01-22T11:57:00") 1485115020000

Tenga en cuenta que la respuesta del navegador Safari es de 8 horas (28800000 ms) menos que la respuesta vista en el navegador Chrome porque Safari devolvió la respuesta en TZ local (que está 8 horas detrás de UTC)

Para obtener los dos tiempos en el mismo TZ

Safari:

Date.parse("2017-01-22T11:57:00Z") 1485086220000

Cromo:

Date.parse("2017-01-22T11:57:00Z") 1485086220000


La mejor forma de hacerlo es mediante el siguiente formato:

new Date(year, month, day, hours, minutes, seconds, milliseconds) var d = new Date(2018, 11, 24, 10, 33, 30, 0);

Esto es compatible con todos los navegadores y no le dará ningún problema. Tenga en cuenta que los meses están escritos del 0 al 11.


Para mí, implementar una nueva biblioteca solo porque Safari no puede hacerlo correctamente es demasiado y una expresión regular es exagerada. Aquí está el delineador :

console.log (new Date(''2011-04-12''.replace(/-/g, "/")));


Para que una solución funcione en la mayoría de los navegadores, debe crear su fecha-objeto con este formato

(year, month, date, hours, minutes, seconds, ms)

p.ej:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11 alert(dateObj.getTime()); //gives back timestamp in ms

funciona bien con IE, FF, Chrome y Safari. Incluso versiones más antiguas.

IE Dev Center: Date Object (JavaScript)

Red Mozilla Dev: Fecha


Tuve el mismo problema. moment.js usé el moment.js problema se ha desvanecido.

Al crear un momento a partir de una cadena, primero verificamos si la cadena coincide con formatos conocidos de ISO 8601, y luego recurrimos a una nueva Fecha (cadena) si no se encuentra un formato conocido.

Advertencia: el soporte del navegador para analizar cadenas de caracteres no es consistente. Debido a que no hay especificaciones sobre qué formatos deben admitirse, lo que funciona en algunos navegadores no funcionará en otros navegadores.

Para obtener resultados consistentes al analizar cualquier cadena que no sea ISO 8601, debe usar String + Format.

p.ej

var date= moment(String);


Uso el momento para resolver el problema. Por ejemplo

var startDate = moment(''2015-07-06 08:00'', ''YYYY-MM-DD HH:mm'').toDate();


Utilice el siguiente formato, funcionaría en todos los navegadores

var year = 2016; var month = 02; // month varies from 0-11 (Jan-Dec) var day = 23; month = month<10?"0"+month:month; // to ensure YYYY-MM-DD format day = day<10?"0"+day:day; dateObj = new Date(year+"-"+month+"-"+day); alert(dateObj);

// Tu salida se vería así: "Mar 23 de marzo de 2016 00:00:00 GMT + 0530 (IST)"

// Tenga en cuenta que esto sería en la zona horaria actual en este caso denotado por IST, para convertir a la zona horaria UTC puede incluir

alert(dateObj.toUTCSting);

// Tu salida ahora quiere esto "Mar, 22 Mar 2016 18:30:00 GMT"

Tenga en cuenta que ahora dateObj muestra la hora en formato GMT, también tenga en cuenta que la fecha y la hora han sido modificadas de forma correspondiente.

La función "toUTCSting" recupera el tiempo correspondiente en el meridiano de Greenwich. Esto lo logra estableciendo la diferencia de tiempo entre su zona horaria actual y la zona horaria de Meridiano de Greenwich.

En el caso anterior, el tiempo antes de la conversión fue de 00:00 horas y minutos el 23 de marzo del año 2016. Y después de la conversión de GMT + 0530 (IST) a GMT (básicamente resta 5,30 horas de la marca de tiempo dada en este caso) el tiempo refleja 18.30 horas el 22 de marzo en el año 2016 (exactamente 5,30 horas después de la primera vez).

Además de convertir cualquier objeto de fecha a la marca de tiempo, puede usar

alert(dateObj.getTime());

// la salida se vería similar a esta "1458671400000"

Esto le daría la marca de tiempo única del tiempo


convertir cadena a Date fromat (debe conocer la zona horaria del servidor)

new Date(''2015-06-16 11:00:00''.replace(//s+/g, ''T'').concat(''.000+08:00'')).getTime()

donde +08: 00 = timeZone del servidor


use el formato ''mm / dd / aaaa''. Por ejemplo: - nueva fecha (''02 / 28/2015 ''). Funciona bien en todos los navegadores.