Вся отметка времени сокращается на 2 часа, Java 1.7 и MS SQL Server. - PullRequest
1 голос
/ 19 сентября 2019

Я разработал Rest API на основе Spring, возвращая список DTO.В моем DTO у меня есть некоторые поля, имеющие TimeStamp в качестве DataType.В то время как я пытаюсь отладить, API возвращает значения хорошо и хорошо, только проблема в том, что все значения меток времени сокращаются на 2 часа.Например: должно возвращаться

2019-09-04 00: 00: 00.000,

, но возвращается

2019-09-03T22: 00: 00Z

Я уже пытался изменить дату и время своего компьютера, чтобы увидеть, есть ли какой-либо эффект, но не помогаю

@GetMapping("/")
public ResponseEntity<List<ActionCustomDto>> getAllActions(HttpServletRequest request, @RequestParam(value = "ncId", required = true) List<String> ncIdList, @RequestParam(value = "actionPlan", required = true) List<String> actionPlanList) {
    LOGGER.info("Fetching Action List with the following params : ncIdList = " + ncIdList + ", actionPlanList = " + actionPlanList);
    // String user = request.getHeader("X-User-Login");
    // LOGGER.info("Retrieved user ad login : " + user);

    List<String> exactActionPlans = this.populateExactActionPlans(actionPlanList);
    List<ActionCustomDto> result = new ArrayList<>();

    for (final String ncId : ncIdList) {

        List<ActionPlanDto> actionPlans = this.actionPlanService.findRequiredActionPlans(ncId, exactActionPlans);

        for (ActionPlanDto actionPlan : actionPlans) {
            List<ActionDto> actions = this.actionService.findRequiredActions(actionPlan.getActionPlanId());
            for (ActionDto action : actions) {
                ActionCustomDto actionCustomDto = new ActionCustomDto();
                this.populateActionCustomDto(actionCustomDto, action, ncId);
                result.add(actionCustomDto);
            }
        }
    }

    return ResponseEntity.ok().body(result);
}

private void populateActionCustomDto(ActionCustomDto actionCustomDto, ActionDto action, String ncId) {

    actionCustomDto.setActionDescription(action.getActionDescription());
    actionCustomDto.setStartDate(action.getStartDate());
    actionCustomDto.setDueDate(action.getDueDate());
    actionCustomDto.setAssigneeResponse(action.getActionResponse());
    actionCustomDto.setActionStatus(action.getActionStatus());
    actionCustomDto.setIsDeleted(action.getIsDeleted());
}

открытый класс ActionCustomDto {

private String actionDescription;

private Timestamp startDate;

private Timestamp dueDate;

private String assigneeResponse;

private String actionStatus;

private Boolean isDeleted;

public String getActionDescription() {
    return this.actionDescription;
}

public void setActionDescription(String actionDescription) {
    this.actionDescription = actionDescription;
}

public Timestamp getStartDate() {
    return this.startDate;
}

public void setStartDate(Timestamp startDate) {
    this.startDate = startDate;
}

public Timestamp getDueDate() {
    return this.dueDate;
}

public void setDueDate(Timestamp dueDate) {
    this.dueDate = dueDate;
}

public String getAssigneeResponse() {
    return this.assigneeResponse;
}

public void setAssigneeResponse(String assigneeResponse) {
    this.assigneeResponse = assigneeResponse;
}

public String getActionStatus() {
    return this.actionStatus;
}

public void setActionStatus(String actionStatus) {
    this.actionStatus = actionStatus;
}


public List<String> getSerialNumbers() {
    return this.serialNumbers;
}

public void setSerialNumbers(List<String> serialNumbers) {
    this.serialNumbers = serialNumbers;
}

public Boolean getIsDeleted() {
    return this.isDeleted;
}

public void setIsDeleted(Boolean isDeleted) {
    this.isDeleted = isDeleted;
}

}

Фактический результат:

actionDescription: "action description 1",
startDate: "2019-09-03T22:00:00Z",
dueDate: "2019-09-03T22:00:00Z",
assigneeResponse: "",
actionStatus: "Action-Assigned-New",
isDeleted: false
}

Ожидаемый результат:

actionDescription: "action description 1",
startDate: "2019-09-04 00:00:00.000",
dueDate: "2019-09-04 00:00:00.000",
assigneeResponse: "",
actionStatus: "Action-Assigned-New",
isDeleted: false
}

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

Прежде всего, имейте в виду, что Z в конце даты означает UTC (или смещение нуля от UTC ).

В моем DTO у меня есть некоторые поля, имеющие Timestamp в качестве типа данных.

Начиная с Java 8, Date и их друзья, такие как Time, Timestamp, Calendar и SimpleDateFormat являются унаследованными классами .Они не устарели (пока), но вам следует избегать этого.В вашей ситуации вы можете использовать Instant или OffsetDateTime.

Для Java 7 и ниже, вы можете рассмотреть ThreeTenBackport project: id возвращает бэкпорт классов даты и времени Java 8 в Java 6 и 7, поэтому вы можете использовать Instant или OffsetDateTime.

Если по какой-то причине использование бэкпорта не является вариантом, вы можете установить часовой пояс для Джексона:

spring.jackson.time-zone: UTC
0 голосов
/ 19 сентября 2019

У меня была такая же проблема ... Это MySQL?Попробуйте указать как сервер, так и часовой пояс в строке подключения.Мой MySQL-сервер, работающий на Docker, как-то не смог бы правильно определить его часовой пояс.Это исправило это для меня:

jdbc: mysql: // сервер: 3306 / база данных? UseSSL = false & useUnicode = true & characterEncoding = utf-8 & serverTimezone = Америка / Sao_Paulo & sessionVariables = time_zone = 'Америка / Sao_Paulo'

0 голосов
/ 19 сентября 2019

Конфигурация time zone вашей БД должна быть UTC +0.Поэтому, когда вы вводите некоторое значение date, оно автоматически изменится на UTC +0.

. По этой причине, когда вы получаете эти данные, вы видите дату на 2 часа меньше, так как ваше местное время составляет UTC +2.

Кроме того, вы не можете установить значение в определенном часовом поясе с помощью Timestamp.

Чтобы решить эту проблему, вы должны либо объявить SimpleDateFormat для перенастройки Dates, либо изменить конфигурацию time zone вашей БД.

0 голосов
/ 19 сентября 2019

Измените метку времени для ZonedDateTime, и вы получите точную дату с зонированным временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...