DateTime hasta la fecha de JavaScript


98

De otra respuesta en Stackoverflow es una conversión de la fecha de Javascript a .net DateTime:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000);

Pero, ¿cómo se hace al revés? ¿DateTime a la fecha de Javascript?


En preguntas como esta que obviamente están relacionadas con ajax, debe especificar dónde está realizando la conversión, y considerando que no existe un estándar para la serialización de fechas en JSON y que es posible que esté tratando con MS Date munging, por ejemplo / Date (02020202 ) / asegúrate de dejar eso claro también. buena suerte
Sky Sanders

2
Debe vincular la respuesta a la que se refiere
cdmckay

Respuestas:


116

Tratar:

return DateTime.Now.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

Editar: el UTC verdadero es mejor, pero luego debemos ser consistentes

return DateTime.UtcNow
               .Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc))
               .TotalMilliseconds;

Aunque, pensándolo bien, no importa, siempre que ambas fechas estén en la misma zona horaria.


5
Es posible que desee utilizar DateTime.UtcNow en lugar de DateTime.Now
Matt Dearing

2
Con respecto a sus segundos pensamientos: sí importa durante la transición hacia o desde el horario de verano (siempre tengo que pensar mucho para recordar cuál :). Durante la transición, la hora de 2:00 a 3:00 se repite dos veces. Esto significa que durante una hora, la fecha de JavaScript se retrasará una hora. UTC no tiene DLS por lo que no tiene ese problema.
Sebastiaan M

Tengo el mismo código aquí, pero hace una diferencia de 5:30 en la fecha de JavaScript, mientras que la fecha de C # funciona bien.
Jenish Zinzuvadiya

44

El constructor de JavaScript Date acepta varios milisegundos desde la época de Unix (1 de enero de 1970 a las 00:00:00 UTC). Aquí está el método de extensión C # que convierte el objeto .Net DateTime a la fecha de JavaScript:

public static class DateTimeJavaScript
{
   private static readonly long DatetimeMinTimeTicks =
      (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;

   public static long ToJavaScriptMilliseconds(this DateTime dt)
   {
      return (long)((dt.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 10000);
   }
}

Uso de JavaScript:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);

Fecha larga de uso de C # = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); verifique en javascript (presione F12 en Google Chrome y vaya a la consola) var date = new Date (long); console.log (date.toString ());
Gonen09

24

Puedes probar esto en tu Acción:

return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");

Y esto en tu éxito con Ajax:

success: function (resultDateString) {
    var date = new Date(resultDateString);
}

O esto en su Vista: (Javascript más C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');

1
Fácil y rápido de entender
FindOutIslamNow

la mejor respuesta para mí
Navid

23

Con Moment.js simplemente use:

var jsDate = moment(netDateTime).toDate();

¿Dónde netDateTimeestá serializada su variable DateTime, algo así como "/Date(1456956000000+0200)/".


11

Esto debería funcionar:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

4

Sé que esto es un poco tarde, pero esta es la solución que tuve que encontrar para manejar las fechas en las que desea ser independiente de la zona horaria. Básicamente, implica convertir todo a UTC.

De Javascript al servidor :

Envíe las fechas como valores de época sin el desplazamiento de la zona horaria.

var d = new Date(2015,0,1) // Jan 1, 2015
// Ajax Request to server ...
$.ajax({
  url: '/target',
  params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});

A continuación, el servidor recibe 1420070400000 como fecha de época.

En el lado del servidor, convierta ese valor de época en un objeto de fecha y hora:

DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);

En este punto, la fecha es solo la fecha / hora proporcionada por el usuario tal como la proporcionó. Efectivamente es UTC.

Yendo al revés :

Cuando el servidor extrae datos de la base de datos, presumiblemente en UTC, obtenga la diferencia como una época (asegurándose de que ambos objetos de fecha sean locales o UTC):

long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;

o

long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;

Cuando javascript reciba este valor, cree un nuevo objeto de fecha. Sin embargo, este objeto de fecha se asumirá como la hora local, por lo que debe compensarlo con la zona horaria actual:

var epochValue = 1420070400000 // value pulled from server.
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))

console.log(utcDateVal); // Wed Dec 31 2014 19:00:00 GMT-0500 (Eastern Standard Time)
console.log(actualDate); // Thu Jan 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)

Hasta donde yo sé, esto debería funcionar para cualquier zona horaria en la que necesite mostrar fechas que son independientes de la zona horaria.


3

Este método me funciona:

   public sCdateToJsDate(cSDate: any): Date {
        // cSDate is '2017-01-24T14:14:55.807'
        var datestr = cSDate.toString();
        var dateAr = datestr.split('-');
        var year = parseInt(dateAr[0]);
        var month = parseInt(dateAr[1])-1;
        var day = parseInt(dateAr[2].substring(0, dateAr[2].indexOf("T")));
        var timestring = dateAr[2].substring(dateAr[2].indexOf("T") + 1);
        var timeAr = timestring.split(":");
        var hour = parseInt(timeAr[0]);
        var min = parseInt(timeAr[1]);
        var sek = parseInt(timeAr[2]);
        var date = new Date(year, month, day, hour, min, sek, 0);
        return date;
    }

1

Si usa MVC con maquinilla de afeitar

----- Maquinilla de afeitar / C #

var dt1 = DateTime.Now.AddDays(14).Date;
    var dt2 = DateTime.Now.AddDays(18).Date;

    var lstDateTime = new List<DateTime>();
    lstDateTime.Add(dt1);
    lstDateTime.Add(dt2);

--- Javascript

$(function() {

            var arr = []; //javascript array

            @foreach (var item in lstDateTime)
             {
                @:arr1.push(new Date(@item.Year, @(item.Month - 1), @item.Day));
             }
  • 1: crea la lista en C # y rellénala
  • 2: crea una matriz en javascript
  • 3: usa navaja para iterar la lista
  • 4: Use @: para volver a js y @ para cambiar a C #
  • 5: El -1 en el mes para corregir el número del mes en js.

Buena suerte


0
<input type="hidden" id="CDate" value="<%=DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%>" />

Para convertir la fecha a fecha JS (todos los números):

var JSDate = $("#CDate").val();
JSDate = Date.parse(JSDate);

0

Otra respuesta tardía, pero esta falta aquí. Si desea manejar la conversión de serializado /Date(1425408717000)/en javascript, simplemente puede llamar:

var cSharpDate = "/Date(1425408717000)/"
var jsDate = new Date(parseInt(cSharpDate.replace(/[^0-9 +]/g, '')));

Fuente: amirsahib


Es una respuesta pero, ¡qué asco! No lo recomiendo. Dos trucos no hacen un derecho. Y la serialización de Microsoft es un truco de mal gusto.
Suncat2000

@ Suncat2000 ¿cómo es este truco? Si está utilizando un servicio para recuperar valor del servidor al front-end, no conozco ninguna alternativa mejor. Esta es la solución más limpia del problema en esta página. Si conoces una alternativa mejor, ¿te importaría mostrarnos un ejemplo?
Kajbo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.