News for hackers. Stuff that matters.
Re:Do not use 'week year': YYYY by arghwhat on Tuesday January 04, 2022 @08:27AM (#29794434)
> Is it just me for thinking that using format strings instead of some strongly typed interface with verbose names for this is not great?

Yes, but it would not have helped with the bug in question. The parallel bug for a strongly typed interface would be "year()" returning this monstrosity, while "iso_year()" or some other poorly named variant returning the expected year.

No API is immune to footguns and bad design decisions.

Re:Do not use 'week year': YYYY by ljm on Tuesday January 04, 2022 @08:39AM (#29794541)
I forgot how bad JS's date API was until I tried getting the year out of a date.

    var date = new Date()
    date.getYear() // 122
I plugged this into another object and couldn't understand why it was setting the date to 0122. Like, what significance does 122 years from 1900 even have?

Turns out I had to use getFullYear, which is of course perfectly intuitive.

Re:Do not use 'week year': YYYY by jasamer on Tuesday January 04, 2022 @08:57AM (#29794749)
I used the JS Date API for the first time a few months ago, and wrote something like

    date.getYear() + "-" + date.getMonth() + "-" + date.getDay()
in the hope of getting something like "2022-1-4".

The actual result for that date is "122-0-2" - not a single component of the date was what I expected.

Re:Do not use 'week year': YYYY by jazzyjackson on Tuesday January 04, 2022 @10:43AM (#29795951)
date.toLocaleDateString ("fr-CA") would have got you there, but yea agreed 0 indexed months are whack.

I'm sure you've read the docs since then but just for the viewers at home:

s/getYear/getFullYear

s/getDay/getDate

getYear is oldfashioned, years since 1900. getDay is day-of-the-week, 0 for Sunday, 1 for Monday, etc

Re:Do not use 'week year': YYYY by cookie_monsta on Tuesday January 04, 2022 @04:47PM (#29801024)
> 0 indexed months are whack

Why, if everything else in JS is 0 indexed? Isn't consistency a good thing in a language? If they'd gone the other way, wouldn't there be people here complaining that 1 indexing is whack?

Re:Do not use 'week year': YYYY by jazzyjackson on Tuesday January 04, 2022 @06:57PM (#29802820)
Well because days are returned 1-indexed and calendars in general are 1-indexed, but of course the internal 'getMonth' method isn't meant to be a calendar, it's meant to provide an array index to ["January", "February", ...] as an interface to the other methods of printing a human-readable form.
Re:Do not use 'week year': YYYY by 6510 on Tuesday January 04, 2022 @05:31PM (#29801675)
Re:Do not use 'week year': YYYY by iso1631 on Tuesday January 04, 2022 @08:51AM (#29794685)
Well yes, as it's an extention of code written in the 1970s, when dates were most commonly referred to with 2 digits.

Even when javascript was written (and likewise with things like perl and php - and of course the underlying function dated back to the 70s ), it was still quite common for people to write dates by hand as 6/6/96 for June 6th 1996, hence people would often write something like

print day() + "/" + mon() + "/" + year()

If you wanted to put a 4 digit year many people

print day() + "/" + mon() + "/19" + year()

After 2000 came round, many sites would claim the year was 19100, I still saw these sites until well into the late 00s

However some people wrote print day() + "/" + mon() + "/" + (1900 + year())

Which would give the correct display.

Changing year() from returning a 2 digit (which in the 80s and even in the 90s was often preferable) to 4 digits would be a breaking change. Changing it to being "the last two digits" rather than "number of years since 1900" would be a breaking change. That's not something that people like to do, hence things like "getFullYear" to return a 4 digit year (or 3 digit for <1000 etc)

Re:Do not use 'week year': YYYY by cookie_monsta on Tuesday January 04, 2022 @08:53AM (#29794707)
To be fair getYear has been deprecated for over 20 years (a bit after it was deprecated in Java for the same reason). The Y2K problem was a real thing in lots of places.
Re:Do not use 'week year': YYYY by jcranmer on Tuesday January 04, 2022 @09:49AM (#29795319)
The JS Date API was cribbed wholesale from Java's java.util.Date, which was cribbed wholesale from POSIX (and thus Unix) date APIs, which was designed in the 1970s. But both of the cribbings preferred compatibility with the older API rather than fixing obvious warts in the API like "year is since 1900, not 1 BC" or "month is 0-based instead of 1-based."
Re:Do not use 'week year': YYYY by zeroonetwothree on Tuesday January 04, 2022 @08:44AM (#29794616)
It made more sense before 2000 of course. And they can’t really change it without breaking many things.
Re:Do not use 'week year': YYYY by eCa on Tuesday January 04, 2022 @08:55AM (#29794731)
Back then it was quite common to only care about two-digit years, and by implication only years from the 20th century.

This kind of feature[1] lead to many potential Y2K bugs.

[1] Which it shares with Perl and probably many other languages.

Re:Do not use 'week year': YYYY by jameshart on Tuesday January 04, 2022 @10:00AM (#29795450)
"Back then" for Javascript was 1995. The phrase "millennium bug" was already well established in the public mind by then.
Re:Do not use 'week year': YYYY by cbsks on Tuesday January 04, 2022 @09:32AM (#29795125)
date.getYear()

  99:  1999
  100: 2000
  …
  122: 2022
Re:Do not use 'week year': YYYY by cies on Tuesday January 04, 2022 @08:33AM (#29794484)
It's harder to make that bug. The common case is "year of era", so it is likely to be used for "year()".

On the other hand the much less often used "year of week" would be named "year_of_week()" and hence it is clear to everyone that's not likely what you want.

Re:Do not use 'week year': YYYY by nicoburns on Tuesday January 04, 2022 @08:41AM (#29794572)
> It's harder to make that bug. The common case is "year of era", so it is likely to be used for "year()".

That would be the sane thing to do. But the same applies to `YYYY`: it should be used for "year of era". But it hasn't been and that's the problem here. For contrast in moment.js, YYYY and yyyy do what you expect and "week year" is GGGG or gggg.

Re:Do not use 'week year': YYYY by masklinn on Tuesday January 04, 2022 @09:43AM (#29795251)
> That would be the sane thing to do. But the same applies to `YYYY`: it should be used for "year of era".

Why? `yyyy` is simpler to type, so makes a lot more sense for "year of era".

> For contrast in moment.js, YYYY and yyyy do what you expect and "week year" is GGGG or gggg.

In LDML (which I assume is what SimpleDateFormat uses), the G field is already spoken for the era name (BC/BCE and AD/CE).

Re:Do not use 'week year': YYYY by masklinn on Tuesday January 04, 2022 @09:41AM (#29795214)
> The parallel bug for a strongly typed interface would be "year()" returning this monstrosity, while "iso_year()" or some other poorly named variant returning the expected year.

No, the parallel for this would be called `week_year()`, or `iso_week_year()`, to be paired with an `iso_week()` (or `year_week()` since there really is no other formal week-year).

Re:Do not use 'week year': YYYY by jameshart on Tuesday January 04, 2022 @10:05AM (#29795507)
The point is there's nothing about YYYY vs yyyy telling you at a glance that there is a significant semantic difference in the result.

Imagine an API which had methods 'getYear()' and 'GET_YEAR()' where the latter returns the payroll week year, while the former returns the, you know, actual year.

That's what having YYYY produce the week year feels like - a blatant violation of the principle of least surprise.

Which is why your op was saying this is like having an API where year() returns a surprising number thta isn't the year.

You know, like JavaScript does.

Re:Do not use 'week year': YYYY by masklinn on Tuesday January 04, 2022 @10:23AM (#29795692)
> The point is there's nothing about YYYY vs yyyy telling you at a glance that there is a significant semantic difference in the result.

There's the part that the entire LDML datetime grammar works like that.

Literally the next letter in your pattern will make it clear: M is the month, and m is the minute.

Which, granted, makes "y" designating the calendar year less than ideal as you'd want to pair Y with M, rather than y with M. Even more so as the 24-hour hour is H, so your standard ISO-8601 pattern is yyyy-MM-ddTHH:mm:ssZ which is... a bit of a mess casing-wise.

> Imagine an API which had methods 'getYear()' and 'GET_YEAR()' where the latter returns the payroll week year, while the former returns the, you know, actual year.

A big difference is the LDML pattern-space is rather more limited, and casing is definitely an important component of it.

> Which is why your op was saying this is like having an API where year() returns a surprising number thta isn't the year.

> You know, like JavaScript does.

If you want to rag on JS's datetime API, which really is Java's, first get in line, second getYear is hardly the worst offender (that belongs to the paired glue-eaters that are getDay and getDate).

Re:Do not use 'week year': YYYY by jameshart on Tuesday January 04, 2022 @11:32AM (#29796652)
All true.

But there's a little bit of a difference between mm/MM being minutes/months, where at least as someone thinking about datetime formatting you likely have a concept that the concepts of minutes and months are plausible things 'm' might stand for, vs. yyyy/YYYY where unless you've come across it before, the idea that there might be an inbuilt concept of a 'week year' is likely not going to be something that occurs to you.

I suppose the fact that both 'yyyy/mm/dd' and 'YYYY/MM/DD' produce values that are obviously wrong most of the time should be enough of an incentive for developers to go and look. up the codes. But that said, 'YYYY/MM/DD' produces what looks like the right answer for most of January...

Re:Do not use 'week year': YYYY by steerablesafe on Tuesday January 04, 2022 @08:43AM (#29794599)
Sure, the issue is somewhat orthogonal. But I assume they wanted to keep the format string parsing minimal, hence the single letter format specifiers. Once you have a strongly typed API, you are no longer bound by this and you can have sensible names.