Today I came across a blog post from Daniel Nashed about international date conversion. It's a problem I came across about a year ago with getting JSON dates from Notes fields in ODA. The code there was getting the GMT format by parsing specifically for US date formats. For a temporary workaround at the time, for my server, I changed it to UK format. Then a few month ago we had an issue raised on ODA for the same issue.
Because we could use Java 8, we were using the
LocalDate Java class to parse a date string. The problem is that date formats come in multiple ways - MDY for US, DMY for much of the rest of the world, but also YMD. And then different countries have different separators. And as I dug even deeper, there's an additional challenge that times are also handled differently on different servers - 24 hour time or 12 hour time + am/pm.
Fortunately Java (and LotusScript) have the International class (or NotesInternational class in LS). This is a property of the Session (or NotesSession) and will get the current operating system's internationalisation settings. There are various methods available relevant here:
International.getDateSep()to get the separator between portions of the date, e.g. "/" or "-"
International.isDateMDY()to check whether it's US date format
International.isDateDMY()to check whether the day comes first
International.isDateYMD()to check whether the year comes first
International.isTime24Hour()to check if it's 24 hour time format, so 14:00 instead of 2:00pm
Combining all of these allows you to build a date formatter amd date-time formatter for converting the date/time to a ISO format string, as I did in ODA's Session class. We used the
java.time.format.DateTimeFormatterBuilder class to build a
java.time.format.DateTimeFormatter offsetting to GMT, which is what's used in ODA's DateTime class.
isAnyTime() method of DateTime allows us to tell if it's just a date or a date-time. That allows us in
DateTime.toGMTDateTime() to use the GMT string according from the server's DateTime class to pass through a formatter in the same format to return a
java.time.temporal.Temporal that's an instance of either a
java.time.LocalDate for date only or a
java.time.ZonedDateTime for a date-time.
DateTime.toGMTISO() method allows us to use another DateTimeFormatter to get the ISO_INSTANT format for a date-time or ISO_DATE format for a date. So we get the correct ISO format for the relevant server's settings with minimal manipulation.
And believe me, from when Java 8 came out and I started looking at auto-boxing the Java 8 date-time classes to Domino DateTime objects, Notes timezones are such an arcane quirkiness that the minimal manipulation still has this kind of degree of complexity. And as I found out at the time, it's currently not possible to create a DateTime in a timezone other than the server's.