Ao escrever um aplicativo Web, faz sentido armazenar (lado do servidor) todas as datas no DB como registros de data e hora UTC.
Fiquei surpreso quando percebi que você não podia fazer muito nativamente em termos de manipulação de fuso horário no JavaScript.
Estendi um pouco o objeto Date. Essa função faz sentido? Basicamente, toda vez que eu enviar algo para o servidor, será um carimbo de data / hora formatado com esta função ...
Você vê algum problema grave aqui? Ou talvez uma solução de um ângulo diferente?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
Parece um pouco complicado para mim. E também não tenho tanta certeza sobre o desempenho.
javascript
timezone
utc
Merc
fonte
fonte
new Date().toString()
mostrará a representação atual da hora do fuso horário,new Date().toUTCString()
mostrará a reprovação da hora UTC, masnew Date().getTime()
é sempre UTC , porque é assim que a hora Unix é definida como: "A hora Unix (também conhecida como hora POSIX ou hora da época) é um sistema para descrever instantes no tempo, definido como o número de segundos decorridos desde 00:00:00, hora universal coordenada (UTC), quinta-feira, 1 de janeiro de 1970, sem contar os segundos bissextos. "Respostas:
As datas construídas dessa maneira usam o fuso horário local, tornando a data de construção incorreta. Definir o fuso horário de um determinado objeto de data é construí-lo a partir de uma sequência de datas que inclua o fuso horário. (Eu tive problemas para que isso funcionasse em um navegador Android mais antigo.)
Observe que
getTime()
retorna milissegundos, não segundos simples.Para um carimbo de data / hora UTC / Unix, o seguinte deve ser suficiente:
Ele fatorará o fuso horário atual compensado no resultado. Para uma representação em cadeia, a resposta de David Ellis funciona.
Esclarecer:
Essa entrada é tratada como hora local . Se a hora UTC for passada, os resultados serão diferentes. Observe (eu estou no GMT +02: 00 agora, e são 07:50):
Observe também que
getUTCDate()
não pode ser substituídogetUTCDay()
. Isso ocorre porquegetUTCDate()
retorna o dia do mês ; enquanto que,getUTCDay()
retorna o dia da semana .fonte
new Date()
, que cria uma nova data a partir da entrada UTC, mas a trata como data / hora local. 2) Sim, você deve usarMath.floor(this.getTime() / 1000)
neste caso.Você também pode fazer isso utilizando getTimezoneOffset e getTime,
fonte
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Parece quett.getTime() - tt.getTimezoneOffset()
está corretoGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
que inclui um timezone..which derrotas meio o propósito de tentar fazê-lo em js ..A maneira mais fácil de obter a hora UTC em um formato convencional é a seguinte:
fonte
Na verdade, acho que os valores de data em js são muito melhores do que os objetos C # DateTime. Os objetos C # DateTime possuem uma propriedade Kind, mas nenhum fuso horário subjacente estrito como tal e as conversões de fuso horário são difíceis de rastrear se você estiver convertendo entre dois horários não UTC e não locais. Em js, todos os valores de Data têm um valor UTC subjacente, que é transmitido e conhecido, independentemente das conversões ofensivas ou de fuso horário que você faz. Minha maior reclamação sobre o objeto Date é a quantidade de comportamento indefinido que os implementadores de navegador escolheram incluir, o que pode confundir as pessoas que atacam datas em js com tentativa e erro do que ler as especificações. Usar algo como iso8601.js resolve esse comportamento variável, definindo uma única implementação do objeto Date.
Por padrão, a especificação diz que você pode criar datas com um formato de data ISO 8601 estendido, como
Assim, você pode deduzir a hora exata do UTC dessa maneira.
Quando você deseja passar o valor Date de volta para o servidor, você chamaria
ou se você preferir trabalhar com um registro de data e hora em milissegundos (número de milissegundos a partir do 1º de janeiro de 1970 UTC)
ISO 8601 é um padrão. Você não pode ficar confuso sobre o que significa uma sequência de datas se incluir o deslocamento da data. O que isso significa para você como desenvolvedor é que você nunca precisa lidar com as conversões da hora local . Os valores da hora local existem exclusivamente para o benefício do usuário, e os valores da data, por padrão, são exibidos na hora local. Todas as manipulações de horário local permitem exibir algo sensível ao usuário e converter seqüências de caracteres da entrada do usuário. É uma boa prática converter para UTC o mais rápido possível, e o objeto js Date torna isso bastante trivial.
Por outro lado, não há muito escopo para forçar o fuso horário ou a região para o cliente (que eu conheço), o que pode ser irritante para configurações específicas do site, mas acho que o motivo por trás disso é que é um usuário configuração que não deve ser tocada.
Portanto, em resumo, a razão pela qual não há muito suporte nativo para manipulação de fuso horário é porque você simplesmente não deseja fazê-lo.
fonte
Geralmente, você não precisa fazer muita "manipulação de fuso horário" no lado do cliente. Como regra, tento armazenar e trabalhar com datas UTC, na forma de
ticks
" número de milissegundos desde meia-noite de 1º de janeiro de 1970 ". Isso realmente simplifica o armazenamento, a classificação, o cálculo de compensações e, acima de tudo, livra você da dor de cabeça dos ajustes "Horário de verão". Aqui está um pequeno código JavaScript que eu uso.Para obter a hora UTC atual:
Em geral, o que você precisa é formatar a data / hora do usuário final para o fuso horário local e o formato. A seguir, cuida de todas as complexidades dos formatos de data e hora no computador cliente:
Então, o seguinte exemplo:
Retorna o seguinte (para minha localidade em inglês dos EUA):
fonte
getTimezoneOffset
valor em suagetCurrentTimeUTC
função, você está retornando um momento diferente. O resultado de jágetTime
está no UTC.tmLoc.getTime()
é um deslocamento em relação à hora local. É fácil verificar se você tem acesso a qualquer coisa que execute JavaScript.getTime
, que aponta para o "valor de tempo" definido em §15.9.5 , que é aPrimitiveValue
, conforme definido em §15.9.3.3 explicitamente como UTC.tmLoc
vianew Date()
, é a mesma coisa. O fuso horário afetará a saída da stringtmLoc.toString()
e itens semelhantes, mas não afetarátmLoc.getTime()
Isso é sempre apenas um número de milissegundos desde a meia-noite de 1970-01-01 no UTC.//The offset is in minutes -- convert it to ms
Eu acho que essa é uma solução melhor
fonte
Se você deseja um liner , o Registro de data e hora UTC Unix pode ser criado em JavaScript como:
Isso levará em consideração o fuso horário do sistema. É basicamente o tempo decorrido em segundos desde a época.
Como funciona:
new Date()
.unary +
antes da criação do objeto para convertê-lotimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
fonte
tilde
, nãotilda
(sic). Infelizmente, isso não me permite remover um erro de digitação, tenho que fazer pelo menos 6 edições de caracteres. Smooth, Stackexchange, smooth #Quero deixar claro que o novo Date (). GetTime () realmente retorna um valor UTC, portanto, é uma maneira realmente útil de armazenar e gerenciar datas de uma maneira que seja independente dos horários localizados.
Em outras palavras, não se preocupe com todas as funções javascript do UTC. Em vez disso, basta usar Date.getTime ().
Mais informações sobre a explicação estão aqui: Se o javascript "(nova Data ()). GetTime ()" for executado em 2 fusos horários diferentes.
fonte
Eu uso o seguinte:
Depois de definido esse método, você pode fazer:
fonte
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
retorna um deslocamento UTC, subtraindo o deslocamento do fuso horário local, tornando-o local, não o UTC, portanto, getUTCTime retorna um deslocamento local, não o UTC.Estou impressionado com a complexidade dessa questão.
Todos são idênticos e todos os seus valores inteiros === EPOCH time: D
Não acredite em mim, checkout: http://www.epochconverter.com/
fonte
Como
new Date().toUTCString()
retorna uma sequência como"Wed, 11 Oct 2017 09:24:41 GMT"
você pode cortar os três últimos caracteres e passar a sequência fatiada paranew Date()
:fonte
EDIT: O código abaixo NÃO funciona. Eu estava sempre assumindo que o novo Date (). GetTime () retornou o número de segundos desde o 1º de janeiro de 1970 NO FUSO FUSO ATUAL. Este não é o caso: getTime () retorna o número de segundos no UTC. Portanto, o código abaixo faz um superajuste bruto. Obrigado a todos!]
Primeiro de tudo, obrigado por suas ideias fantásticas. Eu acho que minha pergunta tinha o título errado ... deveria ter sido "Obtenha o carimbo de data / hora UTC Unix para uma data existente".
Então, se eu tiver um objeto de data:
Eu estava atrás de uma função que me dizia "The UTC Unix Timestamp".
Esta função parece ser o verdadeiro truque:
Observe que funciona em "this" Isso significa que eu posso fazer:
E obtenha o número de segundos desde 1º de janeiro de 1970 no horário Unix. Certo?
É um pouco insano, para mim, que o Javascript armazene tudo em horários UTC, mas para obter esse número, tenho que criar um novo objeto Date passando os getters UTC individuais e, finalmente, chamar getTime () para isso ...
Merc.
fonte
getUTCUnixTime
obtém a hora errada, e JavaScript faz fornecem uma maneira simples para obter o timestamp de umDate
objeto - usando ogetTime
método. Veja todas as outras respostas.Eu acho que é isso que você está esperando ...
Agora,
fonte
Depois de fazer isso
Já é hora UTC
Eu testei em https://www.unixtimestamp.com/index.php
fonte
Usando day.js
No navegador:
No node.js:
Você recebe um registro de data e hora UTC unix sem milissegundos.
fonte
Isso retornará o registro de data e hora no UTC:
fonte
new Date(new Date().toUTCString())
dá a Qua 04 de outubro de 2017 07:20:14 GMT + 0200 (GMT + 02: 00)