Webservices sind ja eine tolle Sache. Alles ist genau spezifiziert, das ganze funktioniert plattformübergreifend auf Basis von XML. Soweit zumindest die graue Theorie.
Wahr ist vielmehr ...
Datumswerte werden im Rahmen von Web Services, so die
Simple Object Access Protocol (SOAP) 1.1 Spezifikation gemäß der W3C Spezifikation
XML Schema Part 2: Datatypes definiert. Man beachte, dass an beiden Spezifikationen IBM-Mitarbeiter beteiligt waren. Ein Übergabewert vom Typ Datum (xsd:date) hat daher das Format "YYYY-MM-DD". Also vier Ziffern für das Jahr, ein Bindestrich (Minus), dann zwei Ziffern für den Monat (01-12), wieder ein Bindestrich (Minus) und dann nochmals zwei Ziffern für den Tag (01-31). Nicht sonderlich schwierig, wenn man den übergebenen Wert auseinanderzwirbeln will -- möchte man meinen.
Wechseln wir mal von der grauen Theorie zu Praxis in der Form von Web Services unter IBMs Lotus Domino 7 Server. Dieser kann ganz wunderbar Web Services anbieten. Ich hab mal ein kleines, primitives geschrieben, um das Problem zu zeigen:
%INCLUDE "lsxsd.lss"
Class i18n
Sub NEW
End Sub
' Call this webservice twice! Once with a a day > 12 and once with a day <= 12
' Notice the difference? ;)
Function GetMonthFromDate(parameter As XSD_DATE) As String
Dim datetime As NotesDateTime
Set datetime = parameter.GetValueAsNotesDateTime()
Print "Date: " & Cstr(datetime.DateOnly)
Print "Month: " & Cstr(Month(datetime.DateOnly))
GetMonthFromDate = "Month: " & Cstr(Month(datetime.DateOnly))
End Function
End Class
Schnuckelig, oder? Macht im Prinzip nichts anderes, als aus dem Übergebenen Datum den Monat auszulesen. IBM war sogar so nett/klug/vorausschauend, den XSD_DATE Wert als NotesDateTime Wert zurückzuliefern, damit man korrekt mit den Datumswerten arbeiten kann (ich sehe Bernhard gerade vor Freude auf- und ab hüpfen).
Um so größer war dann mein Erstaunen, als ich dieses Webservice dann mit ein paar Werten aufrief.
Ruft man dieses nämlich mit dem (angeblichen) Todestag von Elvis (2007-08-16) auf, so ergibt sich folgende (erwartete) Ausgabe auf dem Server:
16.08.2007 15:47:25 HTTP Server: Agent printing: Date: 16.08.2007
16.08.2007 15:47:25 HTTP Server: Agent printing: Month: 8
Nimmt man allerdings ein einen Tag <= 12, z.B. den Geburtstag von Ian Anderson (2007-08-10), so sieht das etwas seltsamer aus:
16.08.2007 15:49:47 HTTP Server: Agent printing: Date: 08.10.2007
16.08.2007 15:49:47 HTTP Server: Agent printing: Month: 10
Hallo? Da muss man schon sehr bewusst schlecht und falsch programmieren, wenn man diese Konvertierung verhaut, oder?
Und bevor jemand fragt - der INI-Parameter
DateOrder hat KEINEN Einfluss auf die Konvertierung im Web Service.
Anbei noch die Demo-DB, ich geh jetzt mal einen ESR bei der IBM aufmachen. Testen lässt sich das ganze recht bequem mit
http://www.soapui.org/ , das dazugehörige WSDL gibts unter
http://server/pfad/ws_i18n.nsf/i18n?WSDL