converting a calendar object into a string in java with format “yyyy-mm-dd hh:mm:ss”

I'm converting a date stored in a calendar object in a string for a query in MySQL. I need the string in format "yyyy-MM-dd HH:mm:ss", i.e.: "2010-01-01 15:30:00". I'm using a code like:

    Calendar TimeStop = Calendar.getInstance();
    TimeStop.set(2010, 01, 01, 15, 30, 0);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String TimeStop_Str = sdf.format(TimeStop.getTime());

now, the string, instead of being "2010-01-01 15:30:00" like I would expect is "2010-02-01 15:30:00". I have already checked on http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html for possible errors in the parser formula (for example the capital MM for month or capital HH for hours) but it didn't worked.

I guess that there is some other field that I should set, or maybe there is another method... any idea?

7
задан BЈовић 23 December 2011 в 13:54
поделиться

2 ответа

Calendar.JANUARY на самом деле 0, а не 1.

Когда вы указываете 01 для поля месяца в set, вы фактически устанавливаете месяц на февраль, поэтому вы получаете 02, когда SimpleDateFormat отображает его как MM.

При использовании любого из методов Calendar.get/set вы должны принять дополнительные меры предосторожности, чтобы убедиться, что вы осведомлены об этом несоответствии между «естественным» индексированием на основе 1 и более "неудобная" индексация Календаря на основе 0. Каждый раз, когда вы получаете/устанавливаете месяц в Календаре, всегда существует вероятность серьезной ошибки.

Это всего лишь один из тех действительно неудобных дизайнов в Календаре , которые оставляют желать лучшего. Joda Time — одна из лучших и приятных API-библиотек для работы с датой/временем, поэтому, если это вообще возможно, вы можете рассмотреть возможность перехода на эту библиотеку.

API-ссылки

  • Calendar.MONTH - "Номер поля для get и set с указанием месяца. Это значение зависит от календаря. Первый месяц год [...] ЯНВАРЬ, что равно 0".
  • Calendar.set(…, int month, …) - "месяц - значение, используемое для установки поля календаря МЕСЯЦ. Значение месяца отсчитывается от 0. например, 0 для января."

О восьмеричных литералах

Также обратите внимание, что 01 на самом деле является восьмеричным литералом (то есть основание 8).Вы не должны иметь привычку добавлять 0 к целочисленным литералам (§3.10.1), потому что они могут вызвать небольшие ошибки/баги, если вы не будете очень осторожны.

Например, int i = 09; является недопустимым кодом Java.

    System.out.println(010); // prints 8, not 10

См. также

8
ответ дан 6 December 2019 в 22:58
поделиться

Просто месяцы начинаются с 0 (а не с 1)

При этом не следует преобразовывать в строку по порядку вставить дату в БД. Вы можете либо использовать метку времени, либо java.sql.Date вместе с PreparedStatement

3
ответ дан 6 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: