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?
Calendar.JANUARY
на самом деле 0
, а не 1
.
Когда вы указываете 01
для поля месяца в set
, вы фактически устанавливаете месяц на февраль, поэтому вы получаете 02
, когда SimpleDateFormat
отображает его как MM
.
При использовании любого из методов Calendar.get/set
вы должны принять дополнительные меры предосторожности, чтобы убедиться, что вы осведомлены об этом несоответствии между «естественным» индексированием на основе 1 и более "неудобная" индексация Календаря
на основе 0. Каждый раз, когда вы получаете/устанавливаете месяц в Календаре
, всегда существует вероятность серьезной ошибки.
Это всего лишь один из тех действительно неудобных дизайнов в Календаре
, которые оставляют желать лучшего. Joda Time — одна из лучших и приятных 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
Просто месяцы начинаются с 0
(а не с 1
)
При этом не следует преобразовывать в строку по порядку вставить дату в БД. Вы можете либо использовать метку времени, либо java.sql.Date
вместе с PreparedStatement