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?

AJ.
fuente
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.

AxelEckenberger
fuente
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);
Yair Nevet
fuente
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")');
Renan Cerqueira
fuente
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)/".

Marco Lackovic
fuente
11

Esto debería funcionar:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
munissor
fuente
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.

Mono de código
fuente
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;
    }
alexey
fuente
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

Dinand
fuente
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);
syaakobi
fuente
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

Kajbo
fuente
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