#java #.net #web-services #date
#java #.net #веб-службы #Дата
Вопрос:
Есть ли какой-либо способ удалить компонент часового пояса из объекта Java Date, который возвращается из веб-службы?
Например, у меня есть дата начала 12 утра. Я хочу, чтобы это использовалось как 12 часов утра по местному времени клиентов.
Я думаю, что если в сообщении soap нет компонента timezone, то используется локальный часовой пояс. Есть 2 других варианта, которые я взвесил, которые будут либо выполнять арифметические вычисления для даты на стороне клиента (чего я действительно не хочу делать), либо создавать новый класс date, который содержит день, месяц и год в виде целых чисел (мне не нужна информация о времени). Последний вариант потребует существенного рефакторинга, поэтому, если есть способ просто отключить информацию о часовом поясе в сообщении soap, это было бы предпочтительнее.
Клиент написан на .NET, поэтому, если есть способ изменить способ интерпретации даты на стороне клиента, который, я думаю, достигнет той же цели.
Ответ №1:
Я полагаю, что нашел решение своей проблемы. Я использовал @XmlJavaTypeAdapter, чтобы изменить способ преобразования класса date в Xml.
Вот DateAdapter, который я использовал.
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<String, Date> {
// the desired format
private String pattern = "yyyy-MM-dd";
public String marshal(Date date) throws Exception {
return new SimpleDateFormat(pattern).format(date);
}
public Date unmarshal(String dateString) throws Exception {
return new SimpleDateFormat(pattern).parse(dateString);
}
}
И я использовал следующую аннотацию ко всем моим средствам получения, которые я хотел использовать в формате даты «гггг-ММ-дд».
@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
Ответ №2:
Date
Объекты Java не имеют компонентов часового пояса. У них вообще нет понятия о часовых поясах: они всегда проходят всего в миллисекундах с полуночи 1 января 1970 года по UTC.
Я мало что знаю о представлении дат и времени в формате SOAP… если вы сможете убедить его, что вам нужна только дата (а не дата и время), у вас вполне может быть все в порядке. В противном случае я предлагаю вам делать все в UTC, но считать, что это местное время на клиенте. Если вы имеете дело только с датами, это не должно быть слишком плохо — хотя вам нужно учитывать, что полночь не всегда наступает на каждую дату в каждом часовом поясе, или это может произойти дважды…
В принципе, жаль, что ни в .NET, ни в Java нет достойного встроенного API для определения даты и времени. На Java есть время Joda, которое вы хотели бы использовать, LocalDate
судя по его звучанию, для представления именно того, что вас интересует (дата в любом местном часовом поясе). В .NET будет (в конечном итоге) время Noda, но оно еще не готово. Даже если бы оба они существовали на соответствующих базовых платформах, вам все равно нужно было бы убедить SOAP сериализовать их соответствующим образом : (