DateTime para data javascript

98

Outra resposta no Stackoverflow é uma conversão de data Javascript para .net DateTime:

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

Mas como fazer o inverso? DateTime para data Javascript?

AJ.
fonte
Em questões como esta, obviamente relacionadas ao Ajax, você deve especificar onde está fazendo a conversão, e considerando que não existe um padrão para serialização de data em JSON e que é possível que você esteja lidando com munging de Data MS, por exemplo, / Date (02020202 ) / certifique-se de deixar isso bem claro. boa sorte
Sky Sanders
2
Você deve vincular a resposta a que está se referindo
cdmckay

Respostas:

116

Experimentar:

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

Editar: o UTC verdadeiro é melhor, mas precisamos ser consistentes

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

Embora, pensando bem, isso não importa, desde que ambas as datas estejam no mesmo fuso horário.

AxelEckenberger
fonte
5
Você pode usar DateTime.UtcNow em vez de DateTime.Now
Matt Dearing,
2
Quanto às suas segundas intenções: isso importa durante a transição para ou do horário de verão (sempre tenho que pensar muito para lembrar qual :). Durante a transição, a hora de 2:00 a 3:00 é repetida duas vezes. Isso significa que durante uma hora, a data do javascript será desativada em uma hora. UTC não tem DLS, portanto, não tem esse problema.
Sebastiaan M
Eu tenho o mesmo código aqui, mas faz 5:30 diferença na data javascript enquanto a data C # funciona bem.
Jenish Zinzuvadiya
44

O construtor JavaScript Date aceita o número de milissegundos desde a época do Unix (1 de janeiro de 1970 00:00:00 UTC). Este é o método de extensão C # que converte o objeto .Net DateTime em data 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
fonte
C # uso data longa = DateTimeJavaScript.ToJavaScriptMilliseconds (DateTime); check in javascript (pressione F12 no Google Chrome e vá para o console) var date = new Date (long); console.log (date.toString ());
Gonen09
24

Você pode tentar isso em seu Action:

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

E isso no seu sucesso no Ajax:

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

Ou isto em sua visualização: (Javascript mais C #)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');
Renan Cerqueira
fonte
1
Fácil e rápido de entender
FindOutIslamNow,
melhor resposta para mim
Navid de
23

Com Moment.js, basta usar:

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

Onde netDateTimesua variável DateTime é serializada, algo como "/Date(1456956000000+0200)/".

Marco Lackovic
fonte
11

Isso deve resolver o problema:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
Munissor
fonte
4

Sei que é um pouco tarde, mas aqui está a solução que tive que encontrar para lidar com as datas em que você quer ser independente do fuso horário. Essencialmente, envolve a conversão de tudo para UTC.

Do Javascript para o servidor :

Envie datas como valores de época com o deslocamento de fuso horário removido.

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) }
});

O servidor então recebe 1420070400000 como a época da data.

No lado do servidor, converta esse valor de época em um objeto datetime:

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

Neste ponto, a data é apenas a data / hora fornecida pelo usuário da forma como foi fornecida. Efetivamente, é UTC.

Indo na outra direção :

Quando o servidor extrai dados do banco de dados, provavelmente em UTC, obtenha a diferença como uma época (certificando-se de que ambos os objetos de data sejam locais ou UTC):

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

ou

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

Quando o javascript recebe esse valor, crie um novo objeto de data. No entanto, este objeto de data será considerado a hora local, então você precisa compensá-lo pelo fuso horário atual:

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)

Pelo que eu sei, isso deve funcionar para qualquer fuso horário em que você precise exibir datas independentes do fuso horário.

Code Monkey
fonte
3

Este método está funcionando para mim:

   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
fonte
1

Se você usa MVC com navalha

----- Razor / 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: crie a lista em C # e preencha-a
  • 2: Crie uma matriz em javascript
  • 3: Use o razor para iterar a lista
  • 4: Use @: para voltar para js e @ para mudar para C #
  • 5: O -1 no mês para corrigir o número do mês em js.

Boa sorte

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

Para converter a data em data JS (todos os números):

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

Outra resposta tardia, mas está faltando aqui. Se quiser lidar com a conversão de serializados /Date(1425408717000)/em javascript, basta chamar:

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

Fonte: amirsahib

Kajbo
fonte
É uma resposta, mas Eca. Eu não recomendo. Dois hacks não acertam. E a serialização da Microsoft é um hack desagradável.
Suncat2000
@ Suncat2000 como é esse hack? Se você está usando um serviço de recuperação de valor do servidor para o front-end, não conheço alternativa melhor. Esta é a solução mais limpa para o problema desta página. Se você conhece uma alternativa melhor, gostaria de nos mostrar um exemplo?
Kajbo