'How to convert date string to epoch timestamp with the OS X BSD `date` command?

I have a date string in the following format Jul 27 23:59:59 2016 GMT and I need to convert it to the equivalent epoch timestamp with the OS X BSD date command.

GNU date has a nice -d/--date=STRING argument:

$ date -d "Jul 27 23:59:59 2016 GMT" +'%s'
1469663999

The BSD date command on OSX sadly has no such option.

date -j -f "<FORMAT>" "Jul 27 23:59:59 2016 GMT" +'%s' seems to be the way to go, but I can't find the write format string. Apple's man page states:

date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

can be used to parse the output from date and express it in Epoch time.

But that doesn't appear to be true:

$ date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
Failed conversion of ``Wed 13 Jul 2016 11:17:49 BST'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

How can I convert a date string in this format to an epoch timestamp with the OS X BSD date command?


I can't seem to get a version out of date, but I'm on OS X 10.11.5 (El Capitan) if that's significant.



Solution 1:[1]

Do you mean this?

date -j -f "%a %b %d %T %Z %Y" "Wed Jul 13 11:30:27 BST 2016" +"%s"
1468405827

I worked that out by telling date to output in the same format as you were using:

date -j +"%a %b %d %T %Z %Y"

Solution 2:[2]

Your date command is outputting the date in the following format:

Wed 13 Jul 2016 11:17:49 BST (Format sequence is: "%a %d %b %Y %T %Z")

and you're trying to parse it with an expression to match the following format:

Wed Jul 13 11:17:49 BST 2016 (Format sequence is: "%a %b %d %T %Z %Y")

Resulting in:

Failed conversion of ``Wed 13 Jul 2016 11:17:49 BST'' using format ``%a %b %d %T %Z %Y''

So, basically, you need to change the format sequence in your command with:

$ date -j -f "%a %d %b %Y %T %Z" "`date`" +"%s"

In order to match the Wed 13 Jul 2016 11:17:49 BST format that your date command is outputting by default.

To use a custom date based on the same format:

 $ date -j -f "%a %d %b %Y %T %Z" "Wed 13 Jul 2016 11:17:49 BST" +"%s"

Some references on what [some of] the format string sequences mean:

  • %a locale's abbreviated weekday name (e.g., Sun)
  • %d day of month (e.g., 01)
  • %b locale's abbreviated month name (e.g., Jan)
  • %Y year
  • %T time; same as %H:%M:%S
  • %Z alphabetic time zone abbreviation (e.g., EDT)

Solution 3:[3]

I ran into an issue trying to convert a similar datetime to epoch. Thought I would put this out here for this format as well. date -j -f "%Y-%m-%d %H:%M:%S" "2018-01-30 15:58:50" "+%s" 1517349530

Solution 4:[4]

Here's another way:

$ python -c 'import time
> print int(time.time())'
1468406482

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Lab Lab
Solution 4