Linux: Defina o deslocamento do fuso horário que não existe?

2

É possível em qualquer Linux forçar um offet de fuso horário que esteja fora do intervalo "válido" de -12 a +14?

Estou procurando uma maneira de simular temporariamente um "horário local" (para fins de teste) que pode ser em dias futuros, se possível, sem realmente alterar o relógio do sistema.

    
por kbluck 29.09.2018 / 20:46

3 respostas

2

É possível usar qualquer nome de fuso horário que não exista e definir o tempo de até + - 24 horas. Assumindo que MYFAKETIME não exista como um fuso horário válido (ainda não existe, mas pode ser definido no futuro (muito improvável)), então, isso é possível:

isaac@mail:~$ date
Sun Sep 30 01:22:05 EST 2018
isaac@mail:~$ TZ=MYFAKETIME date
Sun Sep 30 06:22:43 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+1 date
Sun Sep 30 05:22:56 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+10 date
Sat Sep 29 20:23:00 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+20 date
Sat Sep 29 10:23:05 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+24 date
Sat Sep 29 06:23:08 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+48 date
Sat Sep 29 06:23:14 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+96 date
Sat Sep 29 06:23:25 MYFAKETIME 2018
isaac@mail:~$ 

Observe que fusos horários acima de 24 simplesmente não funcionam. Eles fazem não alterar a hora, mas estão limitados ao intervalo -24 to +24 . De 21.4.7 Especificando o fuso horário com TZ

The first format is used when there is no Daylight Saving Time (or summer time) in the local time zone:

std offset

The std string specifies the name of the time zone. It must be three or more characters long and must not contain a leading colon, embedded digits, commas, nor plus and minus signs. There is no space character separating the time zone name from the offset, so these restrictions are necessary to parse the specification correctly.

The offset specifies the time value you must add to the local time to get a Coordinated Universal Time value. It has syntax like [+|-]hh[:mm[:ss]]. This is positive if the local time zone is west of the Prime Meridian and negative if it is east. The hour must be between 0 and 24, and the minute and seconds between 0 and 59.

Portanto, não há como alterar o tempo para "dias no futuro" usando a variável TZ.

A solução real é usar o utilitário faketime (do pacote com o mesmo nome).

Isso permitirá que você faça:

isaac@mail:~$ faketime '2008-12-24 08:15:42' /bin/date
Wed Dec 24 08:15:42 EST 2008
isaac@mail:~$ date
Sun Sep 30 01:44:29 EST 2018
    
por 30.09.2018 / 08:48
4

A ferramenta que você está procurando é faketime .

faketime 'yesterday 9am' /bin/date
faketime '2018-10-25 16:45' /bin/date
    
por 30.09.2018 / 00:57
2

Basta definir a variável TZ . Valores positivos vão para o leste, então estão para trás GMT.

por exemplo

$ TZ=GMT date
Sat Sep 29 19:12:30 GMT 2018
$ TZ=FAKEEAST+15 date
Sat Sep 29 04:12:36 FAKEEAST 2018
$ TZ=FAKEWEST-15 date
Sun Sep 30 10:12:41 FAKEWEST 2018

Isso só permitirá que você passe +/- 24 horas.

    
por 29.09.2018 / 21:13