Вопрос

Я работаю над приемом значения свидания (Createwhen) из Active Directory и переводя его в дату Java, для целей получения списка счетов, созданных между двумя датами. Все работает нормально, сохранить для одного метода: метод, в котором я иду от даты рекламы до даты Java. Метод выглядит так:

private Date getParsedDate(String givenString) {
    System.out.println("Value from AD is: " + givenString);
    Date parsedDate = null;
    String formattedString = this.formatDateString(givenString);
    System.out.println("Formatted String is: " + formattedString);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/DD");
    try {
        parsedDate = sdf.parse(formattedString);
        System.out.println("Final date string is: " + parsedDate.toString());
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
    return parsedDate;
}

И для одного куска произвольных данных от AD:

Value from AD is: 20050912190509.0Z

Formatted String is: 2005/09/12

Final date string is: Wed Jan 12 00:00:00 EST 2005

Очевидно, что он правильно поднимает день и год (и если я решил включить часы / минуты / секунды, а также так хорошо включает в себя), но Каждый день находится в январе по какой-то причине.

Теперь я уверен, что моя ошибка довольно простая, но я перепроверил мое форматирование около десяти раз, и я в точке, где я просто не вижу этого. Может ли вторая пара глаз, надеюсь, посмотрим на мой код и указываю на то, куда я ошибаюсь, чтобы получить месяц, так что неверно неверно?

Спасибо.

Это было полезно?

Решение

Измените шаблон строки из «ГГГГ / ММ / ДД» на «ГГГГ / ММ / ДД»

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

Другие советы

Убедись, что ты нет Используйте «мм» вместо «мм» или «ммм». Как маленькие м обозначают минуты и CAPS M обозначает месяц.

TL; доктор

    LocalDate parsedDate = OffsetDateTime
            .parse("20050912190509.0Z", DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX"))
            .toLocalDate();

Это дает а LocalDate из 2005-09-12.

Java.Time.

Я вносим вклад в современный ответ. Ответ Сухаса Фартале правильно и был хорошим ответом, когда он был написан 7 лет назад. Сейчас цестененно хлопотно SimpleDateFormat класс долго устарел, и у нас намного лучше в java.time, современная дата и время Java API. Я тепло рекомендую вам использовать это вместо старых занятий даты.

Подробности

Кажется, из вашего кода, который вы переформатируете свою строку от AD, прежде чем распределить его. Там нет необходимости в этом, строка из AD можно проанализировать напрямую. Мы могли бы проанализировать его прямо в LocalDate, но я рекомендую распределять его в OffsetDateTime схватить время и компенсировать из строки; Как видите, это может быть напрямую преобразовано в LocalDate после. А. LocalDate это дата без дня дня, поэтому, кажется, соответствует вашим требованиям лучше, чем старый Date сорт.

Строка в UTC (обозначается Z в конце концов). Вышесказанное дает вам дату из строки, это дата в UTC. Если вместо этого вы хотели, чтобы дата была в вашем местном часовом поясе, когда это было 12 сентября 19:05 в UTC:

    LocalDate parsedDate = OffsetDateTime.parse(givenString, adDateTimeFormatter)
            .atZoneSameInstant(ZoneId.of("America/Coral_Harbour"))
            .toLocalDate();

Я предполагал, что мы объявили Fixtatter статическое поле:

private static final DateTimeFormatter adDateTimeFormatter
        = DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX");

В этом случае результат такой же, для других часовых поясов он не будет. Пожалуйста, замените свой собственный желаемый часовой пояс для America / Coral_Harbour. Чтобы использовать настройку часового пояса JVM, укажите ZoneId.systemDefault(). Отказ Остерегайтесь, однако, что настройка может быть изменена другими частями вашей программы или других программ, работающих в одном JVM, поэтому это хрупкий.

И точка от ответа Сухаса Фартале действует в java.time ТОО: Формат шаблон строк чувствителен к регистру, и мне нужно было использовать строчные dd на день месяца.

Руководство

Узнать больше о java.time в Учебник Oracle и / или поиск других ресурсов в сети.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top