Использование DateFormat.getDateTimeInstance(). Format (date);

При выполнении некоторых тестов я столкнулся с следующей проблемой. При использовании:

private String printStandardDate(Date date) {
    return DateFormat.getDateTimeInstance(
        DateFormat.SHORT, DateFormat.SHORT).format(date);
}

Я обнаружил, что это создало различные форматы Date в зависимости от местоположения тестов, в которых выполняется. Поэтому локально в windows/eclipse я получил результат: 04/02/12 18:18, но на Linux-ящике в Америке я получаю 2/4/12 6:18 вечера

Это приводит к сбою моих тестов/сборки:

ожидаемый: < [04/02/12 18:18] > но был: < [2/4/12 6:18 PM] >

Может ли кто-нибудь объяснить это поведение?

Ответ 1

Это не странно, это точно, как он должен работать.

В документации API DateFormat.getDateTimeInstance говорится:

Получает формат даты/времени с заданными стилями форматирования даты и времени для языкового стандарта по умолчанию.

Локаль по умолчанию отличается от вашей системы Windows, чем в ящике Linux в Америке.

Если вам нужен точный контроль формата даты и времени, используйте SimpleDateFormat и укажите формат самостоятельно. Например:

private String printStandardDate(Date date) {
    return new SimpleDateFormat("dd/MM/yy HH:mm").format(date);
}

Еще лучше было бы повторно использовать объект SimpleDateFormat, но будьте осторожны, что он не является потокобезопасным (если метод может быть вызван из нескольких потоков одновременно, все будет запутано, если эти потоки будут использоваться тот же объект SimpleDateFormat).

private static final DateFormat DATE_FORMAT =
    new SimpleDateFormat("dd/MM/yy HH:mm");

private String printStandardDate(Date date) {
    return DATE_FORMAT.format(date);
}

Ответ 2

Формат основан на локали по умолчанию в вашем коде. Если вы хотите обеспечить результаты, вы должны обязательно использовать определенный язык. Метод getDateTimeInstance перегружен, чтобы предложить альтернативный метод , который получает локаль, которую вы хотите использовать как параметр.

public static final DateFormat getDateTimeInstance(int dateStyle,
                             int timeStyle,
                             Locale aLocale)

Если вы используете один и тот же язык в обеих тестовых средах, результат должен быть таким же.