*By Denver Kirrane and Tony Brady*

Note. Since version 10, Stata has the ability to natively handle times. We therefore only recommend you use the commands below if you are using version 9 or below of Stata.

How do you handle time of day information such as 3:15am or
7:30pm in Stata? One solution, first suggested by **Bill
Gould** is to convert times into fractions of a day like this:

Time | Fraction of day elapsed |
---|---|

3:00am | 0.125 |

6:00am | 0.25 |

12:00 (midday) | 0.5 |

8:30pm | 0.85417 |

00:00 (midnight) | 0.0 |

So that in the same way that dates are stored as whole days
since 1 Jan 1960, times are stored as fractions of a day since
midnight (midnight being the start of a new day). Storing times
in this **elapsed time** format has the nice property that
elapsed times can be added to elapsed dates to give a finer
graded elapsed date format. Elapsed date-times can be compared
to one another to see if one occurred before or after another
using the usual < or > operators.

18th October 2003 is `15996`

in Stata's elapsed date
format. So `15996.25`

is 6:00am on 18th October 2003.

6:00pm on the same day would be `15996.75`

and since
`15996.75 > 15996.25`

then Stata can tell that 6pm
on the 18th October 2003 is later than 6:00am on 18th October
2003.

Unfortunately Stata doesn't recognise this finer date format so
you can't use the `format`

command to show the time
of day stored in a value like `15996.25`

.

However, we've provided you with a few tools to make converting
times to elapsed times and back again easy. These are
**str2time** and **time2str**.

**str2time** converts a string variable containing times in
24 hour clock format (HH:MM or HH:MM:SS) into an elapsed time
format (a numeric value between 0 and 1).

Here's a dataset after running the command:

str2time tod, generate(etod)

tod (string) | etod (double) |
---|---|

03:17 | .13680556 |

15:26 | .64305556 |

13:23 | .55763889 |

14:30 | .60416667 |

16:25 | .68402778 |

02:36 | .10833333 |

14:50 | .61805556 |

01:27 | .06041667 |

13:19 | .55486111 |

20:54 | .87083333 |

**time2str** does the opposite to **str2time**. It
converts a numeric variable containing elapsed times to a string
variable containing times in 24 hour clock format (HH:MM or
HH:MM:SS).

Here's a dataset after running the command:

time2str etod, generate(tod)

etod (double) | tod (string) |
---|---|

.25486111 | 06:06 |

.04444444 | 01:03 |

.42361111 | 10:09 |

.89791667 | 21:33 |

.52152778 | 12:31 |

.84097222 | 20:11 |

.21041667 | 05:02 |

.56388889 | 13:31 |

.26458333 | 06:20 |

.94722222 | 22:44 |

To convert a string of format HH:MM:SS to an elapsed time the formula is:

elapsed time = (HH + MM/60 + SS/3600)/24

To retrieve the hours, minutes and seconds from an elapsed
time, `e`

, we use:

HH = int(e*24) MM = int(60*(e*24 - HH)) SS = int(60*(60*(e*24 - HH) - MM))

Because computers use binary to store numbers they cannot always store fractions precisely. We have to do some rounding in Stata to prevent anomalies occuring when translating between the two formats.

To obtain
**str2time** and **time2str**
type the following into Stata:

`net from https://www.sealedenvelope.com/`

and follow the instructions on screen. This will ensure the files are installed in the right place and you can easily uninstall the command later if you wish.