Можем ли мы преобразовать любое строковое значение даты в Date yyyy-MM-dd в java? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть столбец с именем start_date в базе данных, и поле имеет сопоставление в классе модели, например

   @Column(name = "start_date")
   @Temporal(TemporalType.TIMESTAMP)
   Date startDate

, а в моем pojo то же поле, что и

    String startDate;

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

    modelObj.setStartDate(parse(pojoObj.getStartDate())

, а вот метод parse ()

   private Date parse(String dateValue){
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Date date = formatter.parse(dateValue);
    return date;
    }

этот код работает нормально, когда я указываю дату в формате гггг-ММ-дд, но не работаю в дд-ММ-гггг или гггг-МММ-дд или МММ дд, гггг в любом другом формате. Могу ли я кому-нибудь помочь мне, как я могу сохранить поле даты независимо от его формата. Как String я могу сохранить, но хочу сохранить его как date.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы можете перебрать все свои форматы даты и попытаться проанализировать ввод до даты.

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

    Код может выглядеть как

  private Date parse(String dateValue) {
    final List<SimpleDateFormat> simpleDateFormats = Arrays.asList(
        new SimpleDateFormat("yyyy-MM-dd"),
        new SimpleDateFormat("dd.MM.yyyy"));

    final List<Date> dateCandidates = simpleDateFormats.stream()
        .map(formatter -> tryParse(formatter, dateValue))
        .filter(Objects::nonNull)
        // check if there is more than one date
        .collect(Collectors.toList());
    if (dateCandidates.isEmpty()) {
      throw new RuntimeException(String.format("Unsupported date format %s", dateValue));
    }
    if (dateCandidates.size() > 1) {
      // check if all dates are the same, otherwise throw exception since your input is ambigious
    }
    return dateCandidates.get(0);
  }

  private Date tryParse(SimpleDateFormat formatter, String dateValue) {
    try {
      return formatter.parse(dateValue);
    } catch (ParseException e) {
      return null;
    }
  }
0 голосов
/ 06 мая 2020

Я даю вам решение, база данных использует BIGINT (20), а Pojo использует «Long».

При сохранении в базу данных используйте метку времени длиной 13, преобразовывать в метку времени нужно только тогда, когда получение параметра и преобразование метки времени в любой формат при возврате данных.

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