Форматер даты неправильно форматирует дату - PullRequest
2 голосов
/ 21 октября 2010

Я написал следующий код Java для форматирования даты и времени в определенных форматах.Вы можете увидеть следующий код в ideone .

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
class timeAndDateTransformation{
    public static void main(String[] argv){
            Calendar newDate = new GregorianCalendar(2009,7,1,15,20,00);
            SimpleDateFormat dateFormant = new SimpleDateFormat("yyyy/MM/dd");
            SimpleDateFormat timeFormant = new SimpleDateFormat("HH:mm:ss");
            System.out.println(dateFormant.format(newDate.getTime()).toString());
            System.out.println(timeFormant.format(newDate.getTime()).toString());
    }

}

Это дает мне следующий вывод:

2009/08/01
15:20:00

В этом выводе остальныевсе отлично, кроме месяца.Я пропустил 7 как месяц, но в этом неважном выводе это дает 8 как вывод.Пожалуйста, укажите мне, где я делаю неправильно.Я не очень хорошо знаком с датой / календарем классов Java, поэтому, пожалуйста, потерпите меня.

Ответы [ 4 ]

7 голосов
/ 21 октября 2010

Месяцы начинаются с 0, вы перешли на 7, чтобы разрешить до августа.

Из документации API для java.util.Date:

Месяц представлен целым числом от 0 до 11; 0 - январь, 1 - февраль и т. Д .; таким образом, 11 - декабрь.

Это действительно нелогично делать месяц с нуля. Я думаю, что мы все были сожжены этим в какой-то момент.

2 голосов
/ 21 октября 2010

Людям нравится видеть, что первый месяц (январь) равен 1, так что SimpleDateFormat делает.

Однако компьютерам нравится видеть вещи, начинающиеся с 0, и именно так GregorianCalendar управляет month парам.См. Конструкторы для GregorianCalendar и описание параметра month.

2 голосов
/ 21 октября 2010

Поле месяца в Java основано на нуле.GregorianCalendar.JANUARY равен 0 ... и т. Д. И т. Д. Поэтому, если вы хотите передать дату в конструктор, добавьте ее к значению месяца.

Если вы посмотрите на [JavaDoc здесь] [1], это объясняет это для вас.

[1]: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#set(int, int, int)

1 голос
/ 21 октября 2010

[Java считает январь месяц 0.] [1] Но когда вы выводите номер месяца с помощью SimpleDateFormat, он использует стандартную систему январь - месяц 1.Таким образом, 7-й месяц выводится как 8.

Если у вас возникли проблемы с датой и календарем JDK, рассмотрите возможность использования Время Joda , это намного проще

[1]: http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html#GregorianCalendar(int, int, int)

...