TransWikia.com

Equivalente de "Date.now();" do Javascript em C#?

Stack Overflow em Português Asked by Matheus Miranda on September 5, 2020

Aqui fala como obter milisegundos usando Date.now();, que retorna algo assim 1533144170651.

Segue documentação dele:

O método now() retorna os milisegundos decorridos desde 1 de janeiro
de 1970 00:00:00 UTC até agora como um Number.

Como eu posso fazer isso em C# (desde 1 de janeiro de 1970 00:00:00) ? Tentei dessa forma:

int mil = DateTime.Now.Millisecond;  //retorna 898

4 Answers

Em versões recentes pode usar assim:

using System;
using static System.Console;

public class Program {
    public static void Main() {
        WriteLine(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
    }
}

Veja funcionando no ideone. E no .NET Fiddle. Também coloquei no GitHub para referência futura.

Documentação.

Quase sempre usa-se UtcNow. Geralmente você está representando o ponto no tempo, portanto não pode ter variação não importa onde seja usado. Você usa o horário universal no sistema e o horário local como apresentação apenas. Só usa a hora local no sistema se precisa dela como uma marcação, algo puramente descritivo e não como um ponto no tempo. Chega ao ponto que se precisa usar isso é melhor até usar uma string com o horário já que não é um ponto no tempo.

O crédito da forma direta vai para o Guilherme Nascimento, eu não me lembrava que tinha como acessar o relógio da máquina direto por essa classe, ainda usava uma forma antiga.

Correct answer by Maniero on September 5, 2020

Não seria mais simples usar diretamente o .ToUnixTimeMilliseconds() no DateTimeOffset.Now?

Assim:

  • Milissegundos:

    Console.WriteLine( DateTimeOffset.Now.ToUnixTimeMilliseconds() );
    
  • Segundos (se interessar a alguém):

    Console.WriteLine( DateTimeOffset.Now.ToUnixTimeSeconds() );
    

Note que o unico problema que talvez enfrente com o método .ToUnixTimeMilliseconds() seria a questão de usar isto em uma versão inferior a 4.6 do .NET Framework (o que seria problema de todas respostas feitas aqui até agora).

Ao invés de fazer o cast do DateTime.UtcNow para DateTimeOffset

Nota:

Usar DateTime.UtcNow.ToUnixTimeSeconds() ou DateTime.Now.ToUnixTimeSeconds() parecem ter o mesmo efeito para .ToUnixTimeSeconds() pois provavelmente a classe sabe o horario e zona horaria e deve compensar sozinho isto no retorno do método.


Estrutura DateTimeOffset: https://msdn.microsoft.com/pt-br/library/system.datetimeoffset(v=vs.110).aspx

Answered by Guilherme Nascimento on September 5, 2020

A propriedade Now do C# traz a data e hora atual, diferente do Now do JS.

A propriedade Millisecond retorna um inteiro equivalente aos milisegundos do momento em que Now foi avaliado. Fica mais claro com o exemplo abaixo:

Console.WriteLine("Data com millisegundos: {0:MM/dd/yyy HH:mm:ss.fff}, {1}", 
                  DateTime.Now,DateTime.Now.Millisecond);

Para que criar o mesmo comportamento no C# você deve fazer assim:

using System;

public class Program
{
    public static void Main()
    {

        DateTime d1 = new DateTime(1970, 1, 1);
        DateTime d2 = DateTime.Now;
        double x = new TimeSpan(d2.Ticks - d1.Ticks).TotalMilliseconds;
        double y =((DateTimeOffset)DateTime.UtcNow).ToUnixTimeMilliseconds();
        Console.WriteLine("Calculo com Ticks {0}",x);
        Console.WriteLine("Calculo com UtcNow {0}",y);      

    }
}

Note que o método com Ticks tem uma resolução ligeiramente maior que o método com o UTCNow.

Veja funcionando no .NET Fiddle

Answered by William John Adam Trindade on September 5, 2020

Se quiser um valor similar ao javascript pode calcular a diferença entre a data/hora atual e 01/01/1970:

var d = Math.Floor((DateTime.Now.ToUniversalTime()- new DateTime(1970,1,1)).TotalMilliseconds);

Veja aqui funcionando: https://dotnetfiddle.net/7G2Wpx

Answered by Ricardo Pontual on September 5, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP