# Recipe 3.2 Converting DMYHMS to Epoch Seconds

#### 3.2.1 Problem

You want to convert a date, a time, or both with distinct values for day, month, year, etc. to Epoch seconds.

#### 3.2.2 Solution

Use the timelocal or timegm functions in the standard Time::Local module, depending on whether the date and time is in the current time zone or in UTC.

```use Time::Local;
\$TIME = timelocal(\$sec, \$min, \$hours, \$mday, \$mon, \$year);
\$TIME = timegm(\$sec, \$min, \$hours, \$mday, \$mon, \$year);```

#### 3.2.3 Discussion

The built-in function localtime converts an Epoch seconds value to distinct DMYHMS values; the timelocal subroutine from the standard Time::Local module converts distinct DMYHMS values to an Epoch seconds value. Here's an example that shows how to find Epoch seconds for a time in the current day. It gets the day, month, and year values from localtime:

```# \$hours, \$minutes, and \$seconds represent a time today,
# in the current time zone
use Time::Local;
\$time = timelocal(\$seconds, \$minutes, \$hours, (localtime)[3,4,5]);```

If you're passing month and year values to timelocal, it expects values with the same range as those which localtime returns. Namely, months start at 0, and years have 1900 subtracted from them.

The timelocal function assumes the DMYHMS values represent a time in the current time zone. Time::Local also exports a timegm subroutine that assumes the DMYHMS values represent a time in the UTC time zone. Unfortunately, there is no convenient way to convert from a time zone other than the current local time zone or UTC. The best you can do is convert to UTC and add or subtract the time zone offset in seconds.

This code illustrates both the use of timegm and how to adjust the ranges of months and years:

```# \$day is day in month (1-31)
# \$month is month in year (1-12)
# \$year is four-digit year e.g., 1967
# \$hours, \$minutes and \$seconds represent UTC (GMT) time
use Time::Local;
\$time = timegm(\$seconds, \$minutes, \$hours, \$day, \$month-1, \$year-1900);```

As explained in the introduction, Epoch seconds cannot hold values before Fri Dec 13 20:45:52 1901 or after Tue Jan 19 03:14:07 2038. Don't convert such dates to Epoch secondsuse a Date:: module from CPAN, and do your calculations with that instead.

The documentation for the standard Time::Local module (also in Chapter 32 of Programming Perl); convert in the other direction using Recipe 3.3

 Chapter 1. Strings
 Chapter 2. Numbers
 Chapter 4. Arrays
 Chapter 5. Hashes
 Chapter 6. Pattern Matching
 Chapter 7. File Access
 Chapter 8. File Contents
 Chapter 9. Directories
 Chapter 10. Subroutines
 Chapter 11. References and Records
 Chapter 12. Packages, Libraries, and Modules
 Chapter 13. Classes, Objects, and Ties
 Chapter 14. Database Access
 Chapter 15. Interactivity
 Chapter 16. Process Management and Communication
 Chapter 17. Sockets
 Chapter 18. Internet Services
 Chapter 19. CGI Programming
 Chapter 20. Web Automation
 Chapter 21. mod_perl
 Chapter 22. XML