Дата публикации сериализуется в неправильную дату с 1 выходным - PullRequest
1 голос
/ 22 октября 2019

enter image description here

Я отправляю на свою конечную точку данные departureTime: "2019-10-21" и вывожу полученную переменную flightTime в своей программе Spring.

@CrossOrigin(origins = "*")
@RequestMapping(value="/travel/query", method= RequestMethod.POST)
public ArrayList<TripResponse> query(@RequestBody QueryInfo info,@RequestHeader HttpHeaders headers){

    if(info.getStartingPlace() == null || info.getStartingPlace().length() == 0 ||
            info.getEndPlace() == null || info.getEndPlace().length() == 0 ||
            info.getDepartureTime() == null){
        System.out.println("[Travel Service][Travel Query] Fail.Something null.");
        ArrayList<TripResponse> errorList = new ArrayList<>();
        return errorList;
    }
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    Calendar ca = Calendar.getInstance();
    ca.setTime(info.getDepartureTime());
    System.out.println("Departure date is " + format.format(ca.getTime()));

    ...
}


public class QueryInfo {

    @Valid
    @NotNull
    private String startingPlace;

    @Valid
    @NotNull
    private String endPlace;

    @Valid
    @NotNull
    private Date departureTime;

    public QueryInfo(){
        //Default Constructor
    }

    public String getStartingPlace() {
        return startingPlace;
    }

    public void setStartingPlace(String startingPlace) {
        this.startingPlace = startingPlace;
    }

    public String getEndPlace() {
        return endPlace;
    }

    public void setEndPlace(String endPlace) {
        this.endPlace = endPlace;
    }

    public Date getDepartureTime() {
        return departureTime;
    }

    public void setDepartureTime(Date departureTime) {
        this.departureTime = departureTime;
    }
}

На консоли отображается «Дата отправления 2019-10-20».

Сервер, на котором запущена моя весенняя программа, должен находиться в часовом поясе UTC-7.

Есть идеи, почему возникает эта ошибка? Как мне внести минимальные изменения, чтобы исправить это?

Редактировать:

Я запускаю

 System.out.println(ca.getTimeZone().toString());

, выводит sun.util.calendar.ZoneInfo[id="America/Los_Angeles".... Я думаю, что это правильно.

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Избегайте использования SimpleDateFormat & Calendar, вместо этого используйте ZonedDateTime.

Пример:

ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

Пример вывода:

2019-10-22

Или, если вы хотите продолжить работу со старыми API из пакета java.util, вам нужно использовать это:

ca.setTimeZone(TimeZone.getTimeZone("UTC")); // to set the time zone for using calendar API.
format.setTimeZone(TimeZone.getTimeZone("UTC")); // set timezone for formatter.
0 голосов
/ 22 октября 2019

Другое решение (не самое разумное, но работает) может быть, вы определяете dateField в вашем DTOs как поле String. Таким образом, то, что вы отправляете, вы получите то же самое, без преобразования даты на основе часового пояса или другого материала. Затем вы можете преобразовать эту строку в удобную для вас дату format/timezone.

0 голосов
/ 22 октября 2019

Calendar.getInstance() устанавливает часовой пояс в зависимости от того, где находится сервер. Поэтому, если вы не находитесь в часовом поясе UTC-7, вы увидите расхождение во времени.

Лучший способ обойти это, как правило, работать с конкретным часовым поясом, например UTC, или любым другим часовым поясом, используемым для ваших данных. Затем вы можете получить Calendar для этого конкретного часового пояса следующим образом:

Calendar.getInstance(TimeZone.getTimeZone("UTC"))
...