In the example you gave, wouldn’t the year be off by one when param2.month
is 12?
Comment on xkcd #2867: DateTime
reverendsteveii@lemm.ee 1 year ago
I just spent two days debugging a reporting endpoint that takes in two MM-YYYY parameters and tries to pull info between the first day of the month for param1 and the last day of the month for param2 and ended up having to set my date boundaries as
LocalDate startDate = new LocalDate(1, param1.getMonth(), param2.getYear()); //pretty straightforward, right?
//bump month by one, account for rollover, set endDate to the first of that month, then subtract one day int endMonth = param2.month == 12 ? param2.month + 1 : 1; LocalDate endDate = new LocalDate(1, endMonth, param2.year).minusDays(1);
This is extraordinarily simply for humans to understand intuitively, but to code it requires accounting for a bunch of backward edge/corner case garbage. The answer, of course, is to train humans to think in Unix epoch time.
drislands@lemmy.world 1 year ago
reverendsteveii@lemm.ee 1 year ago
I was transcribing it from memory and that exact problem cost me like two hours when I was writing it the first time. Well spotted, now write me a unit test for that case.
drislands@lemmy.world 1 year ago
Y’know, I legitimately said to myself “I bet they were writing that from memory and just forgot the edge case. I wonder if that was a problem when doing it originally?” before I wrote that comment. 😂 Time to get some Spock tests set up!
kogasa@programming.dev 1 year ago
Unix epoch time in UTC, making sure that your local offset and drift are current at the time of conversion to UTC…
reverendsteveii@lemm.ee 1 year ago
i don’t even care if its wrong, I just want the code to be readable.
kogasa@programming.dev 1 year ago
You should care if it’s wrong.
reverendsteveii@lemm.ee 1 year ago
at the resolution of clock drift in milliseconds when I’m running reports that are, at most, only specific to the day?
Strykker@programming.dev 1 year ago
All dates and times shall be stored and manipulated in Unix time. Only convert to a readable format at the top of the UI, and forget trying to parse user inputs :P that’s just impossible
reverendsteveii@lemm.ee 1 year ago
I picture this being read by the fred armisen “believe it or not, straight to jail” character
hikaru755@feddit.de 1 year ago
Using YearMonth.atEndOfMonth would have been the easier choice there, I think
reverendsteveii@lemm.ee 1 year ago
holy shit, yeah it would have. tyvm, I’ll be putting in a PR first thing monday!
Jarix@lemmy.world 1 year ago
Would you mind trying to explain (ELI5 style) what you did before and why you are excited for this new method for those of us who dont understand code?
reverendsteveii@lemm.ee 1 year ago
it does in a way that’s been reviewed, vetted and tested by a lot of people the thing that I’m trying to do with code that’s only ever been seen by me and one other guy and has been tested to this best of my ability, which i hope is quite good but one person can easily miss edge cases and weird coincidences.
drislands@lemmy.world 1 year ago
To break it down a bit further, the code that was provided is specifically trying to get 5e last day of a month, which I’ll call Month X since it will vary. The code is doing these things, in this order:
All this to get the last day of the month from Month X. The reason they did it this way is so they didn’t have to say “Is this February? Then get day 28. Is this January/March/etc? then get day 31.” and so on.
The code that the other user provided will instead get the last day of Month X without having to do all those steps. It’s doing something in the background to get the same data, but the coder doesn’t have to worry about exactly how because they can trust it will work as expected.
It ultimately boils down to the user carving out a round piece of wood, fitting it on an axle and bolting it on, then to find someone already has cheap wheels for sale that are more stable than what they just made.