j4nd3r53n
j4nd3r53n

Reputation: 830

The date command appears to convert timezones the wrong way?

I'm working on a script where I need to convert the current time, in UTC to something else:

fmt="%Y-%m-%d %H:%M:%S"
tzone=America/Detroit
nowinutc=$(TZ=UTC date +"$fmt");echo $nowinutc
nowintz=$(date -d "TZ=\"$tzone\" $nowinutc" +"$fmt");echo $nowintz
yestintz=$(date -d "$nowintz - 1 day" +"$fmt");echo $yestintz

I know America/Detroit is 5 hours behind UTC, so 08:00:00 should become 03:00:00, but:

$ fmt="%Y-%m-%d %H:%M:%S"
$ tzone=America/Detroit
$ nowinutc=$(TZ=UTC date +"$fmt");echo $nowinutc
2022-02-11 08:49:51
$ nowintz=$(date -d "TZ=\"$tzone\" $nowinutc" +"$fmt");echo $nowintz
2022-02-11 13:49:51
$ yestintz=$(date -d "$nowintz - 1 day" +"$fmt");echo $yestintz
2022-02-12 14:49:51

It's probably not the date command that gets it wrong, but what am I doing wrong here? It looks like everything works the opposite way of expected. Not only does the timezone conversion add 5 hours, but subtracting 1 day adds 25 hours - what is going on here?

Upvotes: 0

Views: 1184

Answers (1)

KamilCuk
KamilCuk

Reputation: 141200

so 08:00:00 should become 03:00:00

Then the input is in UTC and you are in Detroit.

TZ=America/Detroit date -d "08:00:00 UTC" +%H:%M:%S
TZ=America/Detroit date -d "TZ=\"UTC\" 08:00:00" +%H:%M:%S
TZ=America/Detroit date -d "08:00:00+00:00" +%H:%M:%S

From man date examples:

   Show the time on the west coast of the US (use tzselect(1) to find TZ)

          $ TZ='America/Los_Angeles' date

   Show the local time for 9AM next Friday on the west coast of the US

          $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Upvotes: 1

Related Questions