IBM Lotus Domino, Webservices, date-values, i18n and sloppy programmers
Web Services are a fine thing. They are based on XML, fully specified and work platform-independet – in theory.
If you take a look at the Simple Object Access Protocol (SOAP) 1.1 specification and the XML Schema Part 2: Datatypes specification, a date value passed to or from a Web Service as a very specific and clearly defined format. Please note that IBM worked on both specifications.
A date-value (xsd:date) looks like this: „YYYY-MM-DD”. Four digits representing the year, followed by a dash, followed by two dots for the month, followed by another dash, followed by two digits for the day of the month. Simple! Even a PHP-„programmer” could parse that!
Now, how do Web Services in Lotus Domino 7 cope with that? To demonstrate, I wrote this little Web Service:
1 %INCLUDE "lsxsd.lss"
3 Class i18n
5 Sub NEW
6 End Sub
8 ’ Call this webservice twice! Once with a a day > 12 and once with a day <= 12
9 ’ Notice the difference? ;)
10 Function GetMonthFromDate(parameter As XSD_DATE) As String
11 Dim datetime As NotesDateTime
13 Set datetime = parameter.GetValueAsNotesDateTime()
15 Print "Date: " & Cstr(datetime.DateOnly)
16 Print "Month: " & Cstr(Month(datetime.DateOnly))
18 GetMonthFromDate = "Month: " & Cstr(Month(datetime.DateOnly))
20 End Function
22 End Class
Sweet, isn’t it? And very simple. It takes a date-value as an input and sends a string with the value of the given month back. Easy.
I am using, as defined in the Domino Designer Help, GetValueAsNotesDateTime() to get the date-value a valid NotesDateTime item.If you call this Web Service eg. with Elvis’ (alleged) death date (1977-08-16), you get the following output:
16.08.2007 15:47:25 HTTP Server: Agent printing: Date: 16.08.1977 16.08.2007 15:47:25 HTTP Server: Agent printing: Month: 8But if you choose a day value smaller or equal to twelve, e.g. Ian Andersons birthday (1947-08-10), you get:
16.08.2007 15:49:47 HTTP Server: Agent printing: Date: 08.10.1947 16.08.2007 15:49:47 HTTP Server: Agent printing: Month: 10
Do you spot the difference? I get the impression, that the responsible programmer parsed the date into an array, sorted it with bubble sort and took the smallest value as the day, the next one as the month and the largest one as the year. How can such a thing happen?
And before you ask, changing DateOrder in the notes.ini as no effect whatsoever on the Web Service.