Eu tenho um servidor executando com o fuso horário definido como UTC
. Parecia que geralmente era uma boa prática (por favor, corrija-me se estiver errado).
De qualquer forma, um dos servidores aos quais eu me conecto, para scp
arquivos, está em execução EDT
e armazena os arquivos que eu preciso copiar no formato/path/to/filename/data20120913
Eu olhei para tentar rsync
arquivos usando algo como o -mtime -1
sinalizador de localização de arquivos modificados no último dia, mas não tive sorte.
Eu não me importo em usar apenas scp
para copiar o arquivo do dia atual, mas a partir de agora há uma janela de 4 horas em que a execução date +%Y%m%d
fornecerá um dia diferente em cada servidor e isso me incomoda um pouco.
Examinando man date
, vejo que posso obter o horário como UTC
, mas não vejo uma maneira de fazê-lo como outro fuso horário comoEDT
Suponho que eu também possa usar algo como a GNU
extensão de data date -d 20100909 +%s
para obter a data em segundos a partir da época, aplicar um 4 * 60 * 60
segundo cálculo manual e ver como renderizá-la como uma data - mas, quando o horário de verão chegar, ainda haverá uma hora de folga .
Existe uma maneira mais simples de gerar a data em um YYYYMMDD
formato para EDT
um servidor definido como UTC
?
Respostas:
Você pode definir um fuso horário para a duração da consulta, assim:
Observe o espaço em branco entre a
TZ
configuração e odate
comando. Norc
shell Bourne-like e -like, isso define aTZ
variável apenas para a linha de comando. Em outras conchas (csh
,tcsh
,fish
), você sempre pode usar oenv
comando:tl; dr
Em sistemas Linux. fusos horários são definidos nos arquivos no
/usr/share/zoneinfo
diretório Essa estrutura é geralmente chamada de "banco de dados Olson" para homenagear seu colaborador fundador.As regras para cada fuso horário são definidas como linhas de arquivo de texto que são compiladas em um arquivo binário. As linhas assim compiladas definem o nome da zona; um intervalo de dados e tempo durante o qual a zona se aplica; um deslocamento do UTC para o horário padrão; e a notação para definir como ocorre a transição para o horário de verão, se aplicável.
Por exemplo, o diretório "América" contém as informações necessárias para Nova York no arquivo
America/New_York
conforme usado acima.Cuidado que a especificação de uma zona inexistente (nome do arquivo) é silenciosamente ignorada e os horários UTC são relatados. Por exemplo, isso informa um horário incorreto:
A Especificação Única do UNIX, versão 3, conhecida como SUSv3 ou POSIX-2001, observa que, para portabilidade, a cadeia de caracteres que identifica a descrição do fuso horário deve começar com um caractere de dois pontos. Assim, também podemos escrever:
Como método alternativo à especificação de fusos horários usando um nome de caminho para um arquivo de descrição, o SUSv3 descreve o modelo POSIX. Nesse formato, uma sequência é definida como:
onde
std
é o nome do componente padrão edst
é o horário de verão. Cada nome consiste em três ou mais caracteres. O valoroffset
é positivo para os fusos horários a oeste do meridiano principal e negativo para os a leste do meridiano. O deslocamento é adicionado à hora local para obter o UTC (anteriormente conhecido como GMT). Os camposstart
eend
hora indicam quando ocorrem as transições padrão / horário de verão.Por exemplo, no leste dos Estados Unidos, o horário padrão é 5 horas mais cedo que o UTC e podemos especificar
EST5EDT
em vez deAmerica/New_York
. No entanto, essas alternativas nem sempre são reconhecidas, especialmente para zonas fora dos Estados Unidos, e devem ser evitadas.O HP-UX (um UNIX compatível com SUSv3) usa regras de texto
/usr/lib/tztab
e os nomes POSIX como EST5EDT, CST6CDT, MST7MDT, PST8PDT. O arquivo inclui todas as regras históricas para cada fuso horário, semelhante ao banco de dados Olson.NOTA: Você deve ser capaz de encontrar todos os fusos horários inspecionando o seguinte diretório:
/usr/share/zoneinfo
.fonte
export
parece melhor que oenv
comandoVocê pode fazer isso manipulando a
TZ
variável de ambiente. A seguir, será apresentado o horário local para os EUA / Leste, que também será inteligente o suficiente para lidar com o horário de verão quando houver:O nome da zona vem dos arquivos e diretórios internos
/usr/share/zoneinfo
.fonte
Seja cuidadoso! Data felizmente cuspir o tempo no seu fuso horário ATUAL, se você atribuir um fuso horário que não reconhece.
Veja isso:
Observe que não há fuso horário chamado EDT. Na verdade,
retorna
E isso funciona:
No entanto, se seu amigo mora na terra mística de Gobbledygook e as informações da sua zona coincidirem com as suas, você poderá exibir a data no horário da zona de Gobbledygook e terá prazer em fazê-lo sem um valor de saída para que você saiba que o zona não é conhecida por ele:
fonte
TZ
string malformada retorna o horário UTC.fonte
A sintaxe da data é misteriosa e propensa a erros, o que torna uma chamada de linha de comando um problema. Portanto, escrevi um pequeno script ( denominei -o horário mundial ), que imprimirá o horário especificado (ou atual) do zome de horário base (o local) em alguns outros fusos horários e no inverso.
Aqui está. Ajuste-o para atender às suas necessidades, coloque-o no seu caminho e torne-o executável.
fonte
Geralmente, você tem um carimbo de data / hora no fuso horário local e precisa convertê-lo em tz remoto. Isso pode ser feito com:
Onde:
fonte