Weirdness with juce::Time

This

DBG (juce::Time (2021, 6, 30, 0, 0).toString (true, true));

outputs

30 Jul 2021 12:00:00am

I was expecting

30 Jun 2021 12:00:00am

It’s not the conversion to string, since the internal representation of the Time object is

millisSinceEpoch	juce::int64	1627592400000

which i believe is Jul 30.

This happens on macOS.

The documentation for the Time constructor says :

month,	the month, in the range 0 to 11

Which is weird, because the documentation for the day says :

day,	the day of the month, in the range 1 to 31

Perhaps an ancient programming mistake in the Juce code, that couldn’t later be changed/fixed.

Oh shit! Didn’t expect this. I actually read the documentation, but this is the kind of stuff that just gets filtered out as impossible before reaching conciousness.

Thanks for your help!

FWIW JavaScript Date has the same convention for setting the month.

This perversion originates from the c standard

https://en.cppreference.com/w/cpp/chrono/c/tm

and goes from there to the c++ standard library which JUCE uses

https://en.cppreference.com/w/cpp/chrono/c/tm

Still, IMHO this is wrong to the extent that this constructor should be deprecated and replaced with a sensible one.

Interesting finding. I would suggest adding an enum to the time:

enum class Month
{ jan=0, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };

Then create an overload accepting the enum and maybe deprecate the old integer function. It doesn’t fit in 2021.

1 Like

That would be an improvement, but i you still wouldn’t have a constructor that accepts months numbered 1-12. Perhaps setting the enumeration to start from 1 instead of 0 would do the trick. That way you could say

Time (2021, Month (7), 2);

And actually get Jul 2 2021

However, the bottom line is that the current constructor is a trap and causes more harm than good and should be deprecated.

it´s a revolvind door trap, no matter from which side you come. If you are used to the wrong standard or if you use the sensible one. Supplying an integer will catch either one or the other group.

2 Likes