0

I work with web services written in C#, with PHP on my (client) side.

SOAP __getTypes returns that one of the expected parameter to be dateTime birthDate. I tried to send parameter in different ways, like

$date = new DateTime("now");
$wsclient->SomeFunction(array($date->format("Y-m-d\TH:i:s"));

or $date->format('c') I even wrote it just as a string 1932-11-12T00:00:00 and so on. I do not get soap exception, but function returns that received birthDate value was 0001-01-01T00:00:00.

I had a meeting with the developer of web services and he showed me that when he passes System.DateTime type variable to the function it works properly, but he did it locally in C# and not over the web service, just doing

date = new DateTime(1999,9,9,0,0,0);
SomeFunction(date);

What i want to know is how can i pass c# DateTime type from PHP. I guess that i'm doing it right with $date->format('c') or with $date->format("Y-m-d\TH:i:s").

I just want to make sure that this part of code is right and if so, search for problem in other place.

UPDATE: What we came to is: they changed code on their side. Data type remains the same (DateTime), I don't have an idea what they did there, but if I get any information, I'll keep this post up to date.

After few years: They just had no idea what they were doing and I got stuck with a problem, that was just impossible to solve by my side. If WSDL requests DateTime and you send it properly (SOAP doesn't throw an exception) and it doesn't work as it should, than you should be looking for the problem on the other end, for sure.

loler
  • 2,594
  • 1
  • 20
  • 30

3 Answers3

2

"... I had a meeting with the developer of web services and he showed me that when he passes System.DateTime type variable to the function it works properly, but he did it locally in C# ..."

The function you try to invoke in the C# web service takes a System.DateTime object as a parameter. I looked it up at MSDN and learned that it is a C# class. PHP's DateTime Class is not the same, so the service probably recognizes an instance of PHP's DateTime class as invalid data. I am not sure how communication works with C# services, but I would assume that it requires a binary representation of a C# System.DateTime object. It means that you could potentially investigate how C#'s System.DateTime object is represented in binary and manually construct and pass the binary data in PHP. This is however incredible time consuming and you have no gurantee that it will actually work.

A better solution would be to use another function in the web service (if it exists) that retrieve primitime data types as parameters instead of C# specific classes. An example would be a similar function in the web service that retrieves an Unix timestamp (in PHP: time()) which the function can use to create its own System.DateTime C# object. Another example could be a function retrieving a date from a formatted string (e.g. "dd.mm.yyy H:i:s").

It would be easier to help you if you were able to retireve the web service developer's local code/example (the one you mentioned) and post it here.

Stigmha
  • 116
  • 3
  • This was expected answer as i did the same research. I've also asked them to think about variant with Unix time stamp as I considered constructing `System.DateTime` object will be too complicated. Even if I do so, I think I won't be able to send it through the SOAP, as SOAP expected DateTime type will be different and it will throw an exception. Thanks for your time and opinion. – loler Sep 10 '13 at 12:42
  • Unix timestamps are just integers, isn't it be possible to transmit a regular integer to a service function through SOAP? – Stigmha Sep 10 '13 at 13:01
  • Of course, it's possible, but they have to change their code. Finally, I decided to ask them for code update. I posted this question as i was searching for solution in current situation. If i ask them for code update, i should have a really good arguments. – loler Sep 10 '13 at 13:21
0

For one web service we use, the service allows for filtering entries by createdAt timestamps with a DateTime object. What I've found to work with this might be a little kludgy but:

$date = new stdClass();
$date->DateTime = '2012-01-01T00:00:00Z';
$date->OffsetMinutes = -480; // Los Angeles offset also can just be set to NULL

Then the params could be:

$params = array(
 'birthDate' => $date
);

I've looked for ways to use PHP's native DateTime objects but could find any easier way to go.

Hope this helps.

0

just use: date('Y-m-d\TH:i:s', $dob);

AlexB
  • 7,302
  • 12
  • 56
  • 74
Sander
  • 1