Format a DateTime using :strftime with the offset calculated in the hours

I know I’m missing something here, but I’ve bounced around from Calendar and Timex trying to get a :strftime format with the offset computed in the formatted hours to no avail.

Is there a way to format a DateTime string using :strftime but computing the offset in the hours representation?

Currently, I convert a NaiveDateTime with Timex so that I can see what Calendar's calculating as the offset (which shows that everything is correct time-wise — just not my formatting ability).

dt = Timex.to_datetime(naive_date_string, "America/New_York")
datetime = Calendar.strftime(dt, "%A %b. %d, %Y @ %I:%M %z")

"Friday Aug. 20, 2021 @ 06:14 -0400"

It seems like whenever I come back to formatting using :strftime I arrive back in the future because the offset is not able to be computed in the formatted hours.

When I use the %z to see what the offset is, it’s correct and leaves me wishing I could just use something like %I only with the offset computed from the inputted datetime.


1 Like

+hhmm/-hhmm time zone offset from UTC (empty string if naive)

%z already gives you the offset in hours and minutes.

I’m not sure I understood your problem, care to clarify more? What do you mean by “hours representation”?

1 Like

Also, if you just need the offset, you can use DateTime struct directly, using fields utc_offset and std_offset which are in seconds, but you can convert them to hours if you wish.

1 Like

:slight_smile: I was just wondering if there was a way to get the offset calculated in the formatted hours, like 7:00 instead of 10:00 if the offset were say -0300.

From what I can tell is that when using :strftime you always get the hours and offset separately. For example, you’d get 10:00 -0300 (and you can get those separately of course), but you can’t get 7:00 with the offset having been applied to the hours for you.

Is that correct?

So you’re basically trying to convert your datetimes to UTC?

I think shift_zone/3 might be useful to you, or if you use Timex I think convert/2 might be useful.

I think you want to convert your datetimes to “Etc/UTC” or similar.


Thank you :blush: :heart: I think I’ve been going in circles on this one.

You’re welcome.

BTW, I think I pasted the second link wrong, here it is: Timex.Timezone — timex v3.7.6

1 Like

For anyone looking for the straightforward answer to this very basic need (not documented anywhere), can be done like this:

DateTime.shift_zone!(DateTime.from_naive!(record.inserted_at, "UTC"), "Asia/Jerusalem")