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 № 1Eu 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.