/ / Como passar o webservice Java Date para .Net usando o Axis - java, .net, datetime, calendário, eixo

Como passar o webservice Java Date para .Net usando o Axis - java, .net, datetime, calendário, eixo

Eu estou tentando chamar um webservice .net de Java.Eu tenho um java.sql.Date que estou convertendo para um calendário que, em seguida, é passado para .net como um DateTime.

Infelizmente, quando chega ao outro lado,é um dia atrás da data que foi enviada. Este é um problema conhecido como por (http://wiki.apache.org/ws/FrontPage/Axis/DotNetInterop) e eu tenho certeza que há uma maneira de contornar isso, mas eu simplesmente não consigo encontrá-lo.

Alguém sabe de uma maneira de converter corretamente um java.sql.Date para um calendário para que não haja nenhum problema de compensação de 24 horas?

O código que tenho no momento é o seguinte:

java.sql.Date myDate = Date.valueOf("2011-04-11");

Calendar calendarDate = Calendar.getInstance();
calendarDate.clear();

calendarDate.setTime(myDate); //we then pass calendarDate off to webservice...

Quando vejo as informações do fuso horário, vejo o seguinte:

Em Java, o seguinte me pega "Eastern Standard Time (New South Wales)":

calendarDate.getTimeZone().getDisplayName();

No .net o seguinte me leva "AUS Eastern Standard Time":

TimeZone.CurrentTimeZone.StandardName;

Até onde eu sei, tanto o Java quanto o .Net têm a hora local no mesmo fuso horário ...

Respostas:

1 para resposta № 1

Eu não tenho certeza se isso é a coisa correta a fazer ... mas parece ter resolvido o meu problema ...

java.sql.Date myDate = Date.valueOf("2011-04-11");
Calendar calendarDate = Calendar.getInstance();

//normalise the SQL date
//http://download.oracle.com/javase/6/docs/api/java/sql/Date.html
calendarDate.set(Calendar.HOUR_OF_DAY, 0);
calendarDate.set(Calendar.MINUTE, 0);
calendarDate.set(Calendar.SECOND, 0);
calendarDate.set(Calendar.MILLISECOND, 0);

calendarDate.setTime(myDate);

calendarDate.set(Calendar.DST_OFFSET, 0); //Clear the daylight savings offset
calendarDate.set(Calendar.ZONE_OFFSET, 0); //Clear the timezone offset

Definir o deslocamento para zero parece permitir que ele evite o problema de deslocamento.

Eu acho que isso funciona porque os webservices Java e .Net parecem interagir assim:

  • Datas de Java são GMT mais um deslocamento
  • O Axis parece passar a data para .Net sem as informações de deslocamento.
  • .Net, em seguida, assume o horário local por um tempo que é realmente GMT ... o que leva a compensar os problemas de +/- 24 horas.

Eu acho que minha correção de definir o deslocamento para zerodepois de definir a data, o Calendário manterá a data consistente com a hora local na ausência do deslocamento. Assim, quando a data chegar ao serviço Web .Net, a suposição de horário local está correta.

Eu não tenho idéia se esse é o caso ou não e apreciaria uma explicação melhor ... mas por enquanto, a menos que seja dito o contrário, esta solução parece funcionar ...


0 para resposta № 2

de acordo com esse artigo, o .net sempre lida com datas no fuso horário local (wow, está quebrado). então você deve determinar o fuso horário do serviço .net e defina esse fuso horário na sua instância do Google Agenda.