How to convert local date-time string to Unix timestamp (GMT)? - bash

time_var="6/23/2016 3:20:00 AM"
(this is in EDT)
We need to get unix timestamp for this variable after converting its value to GMT.

Just use the -u flag while passing the date with -d:
$ time_var="6/23/2016 3:20:00 AM"
$ date -d"$time_var EDT" -u
Thu Jun 23 07:20:00 UTC 2016
Note I also appended EDT to your date.
From man date:
-d, --date=STRING
display time described by STRING, not 'now'
-u, --utc, --universal
print or set Coordinated Universal Time

Related

How to pass hours and minutes to date command through -d option

I know how to format a date in bash using the date command
date -d 20160304 +%Y%m%d
for example. But now I want to pass a date and time and return the hours and minutes. I know the output format I need is +%H%M, but I don't know how to format the date string and it is not in the man pages.
For example if I try any of these:
date -d 201801010500 +%H%M
date -d 20180101_0500 +%H%M
date -d 2018-01-01_0500 +%H%M
date -d 2018:01:01-05:00 +%H%M
I get an "invalid date" error. When I search google I always find answer referring to the output format, not the input format...
GNU date accepts these format, among others I'm sure
$ date -d '2018-02-16 12:34'
Fri Feb 16 12:34:00 EST 2018
$ date -d '2018-02-16T12:34:56'
Fri Feb 16 12:34:56 EST 2018
$ date -d '2018-02-16T12:34:56Z'
Fri Feb 16 07:34:56 EST 2018
In general, can't go wrong with ISO8601 time formats
I'm in Canada/Eastern time zone
The date utility is pretty impressive in making sense of different arguments for the -d option.
Here is just one example:
$ date -d "20180101 05:00:00"
Mon Jan 1 05:00:00 +07 2018
Note +07 is the local timezone.

Invalid date format in bash

I'm having trouble with checking time since EPOCH. (and late subtract it from another one).
I get the date like this:
var=$(date)
echo $var
wto, 1 mar 2016, 16:00:14 CET
and later I'm trying to turn it into seconds since epoch:
date -d "$var" +"%s"
date: invalid date ‘wto, 1 mar 2016, 16:00:14 CET’
I'm giving this just as an example. Actually I will be reading the date from file, written in default locale format (I'm operating on couple different machines).
if you type date -h there is the reason why you got this error.
the -d option MUST be declared only with TIME and not with complete DATE format
-d,--date TIME Display TIME, not 'now'
so
date -d "23:59:59"
then:
Tue Mar 1 23:59:59 2016
if you need get only the seconds from a date you have to execute this:
date +"%S"
if you use the -d the output will be deplyed in msec

Get UTC time in seconds

It looks like I can't manage to get the bash UTC date in second. I'm in Sydney so + 10hours UTC time
date
Thu Jul 3 17:28:19 WST 2014
date -u
Thu Jul 3 07:28:20 UTC 2014
But when I tried to convert it, I'm getting the same result which is not UTC time
date +%s
1404372514
date -u +%s
1404372515
What am I missing here?
After getting an answer saying date +%s was returning UTC time, here are more details about the problem I'm facing now.
I'm trying to compare a date written in a file with python. This date is written in seconds in UTC time. And the bash date +%s doesn't give me the same one. Actually if I'm doing in python time.asctime(time.localtime(date_in_seconds_from_bash)), I get the current time of Sydney, not UTC. I don't understand.
I believe +%s is seconds since epoch. It's timezone invariant.
I bet this is what was intended as a result.
$ date -u --date=#1404372514
Thu Jul 3 07:28:34 UTC 2014
You say you're using:
time.asctime(time.localtime(date_in_seconds_from_bash))
where date_in_seconds_from_bash is presumably the output of date +%s.
The time.localtime function, as the name implies, gives you local time.
If you want UTC, use time.gmtime() rather than time.localtime().
As JamesNoonan33's answer says, the output of date +%s is timezone invariant, so date +%s is exactly equivalent to date -u +%s. It prints the number of seconds since the "epoch", which is 1970-01-01 00:00:00 UTC. The output you show in your question is entirely consistent with that:
date -u
Thu Jul 3 07:28:20 UTC 2014
date +%s
1404372514 # 14 seconds after "date -u" command
date -u +%s
1404372515 # 15 seconds after "date -u" command
One might consider adding this line to ~/.bash_profile (or similar) in order to can quickly get the current UTC both as current time and as seconds since the epoch.
alias utc='date -u && date -u +%s'
Based on the answer from the other #Adam, here is a one-liner with the UTC date-time and seconds since epoch start:
alias utc='printf "%s : %s\n" "$(date -u)" "$(date -u +%s)"'
The epoch start time is defined as the number of seconds since January 1, 1970 at 00:00 Greenwich Mean Time (GMT), a timezone now known as UTC±00:00 or simply UTC.

"date -d" doesn't accept ISO 8601 format

Am I doing something wrong? I can't believe date -d does not accept its own output when I use the ISO 8601 option with seconds. I either have to remove the 'T' or the timezone to get it to work.
> date -Iseconds
2014-01-14T11:07:57-0800
> date -d "2014-01-14T11:07:57-0800"
date: invalid date `2014-01-14T11:07:57-0800'
> date -d "2014-01-14 11:07:57-0800" # remove the 'T'
Tue Jan 14 11:07:57 PST 2014
> date -d "2014-01-14T11:07:57" # remove the timezone
Mon Jan 13 20:07:57 PST 2014
My current solution is to use date +"%Y-%m-%d %T %z" instead of date -Iseconds but I just thought that was strange.
Perhaps your locale is interfering with the date parsing?
Try specifying the time locale:
$ LC_TIME=C date -d "2014-01-14T11:07:57-0800"
Tue Jan 14 11:07:57 PST 2014
This works for me with GNU date 8.13.
GNU coreutils have only supported ISO 8601 dates as input since version 8.13 (released on 2011-09-08).
Thanks to #John1024 for the reference to
https://unix.stackexchange.com/questions/107750/how-to-parse-iso8601-dates-with-linux-date-command

Get date of some UNIX time

How can I convert UNIX time to date format?
Smth like
$> date ???? 1300000000
Mar 13 2011 07:06:40 GMT
Your date command might understand the # prefix. Try:
$ date -d #1300000000
Sun Mar 13 08:06:40 CET 2011
If -d doesn't work for you, thats probably because it only works like that for GNU date.
For BSD, OSX, etc. one would ordinarily use:
date -r 1300000000

Resources