Как преобразовать строку в дату с помощью SimpleDateFormat?

у меня есть этот фрагмент кода:

DateFormat formatter1;
formatter1 = new SimpleDateFormat("mm/DD/yyyy");
System.out.println((Date)formatter1.parse("08/16/2011"));

когда я запускаю это, я получаю это как результат:

Sun Jan 16 00:10:00 IST 2011

Я ожидал:

Tue Aug 16 "Whatever Time" IST 2011

Я хочу сказать, что я не получаю в месяц, как ожидалось. В чем ошибка?

10 ответов


попробуйте это:

new SimpleDateFormat("MM/dd/yyyy")
  • MM - "месяц" (не mm)
  • dd "день" (не DD)

это все javadoc для SimpleDateFormat


FYI, причина, по которой ваш формат по-прежнему является допустимым форматом даты, заключается в том, что:

  • mm это "минуты"
  • DD "день в году"

кроме того, вам не нужно приведение к Date... это уже is a Date (или взрывается):

public static void main(String[] args) throws ParseException {
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").parse("08/16/2011"));
}

выход:

Tue Aug 16 00:00:00 EST 2011

вуаля!


м - мин м - месяцев

Letter  Date or Time Component  Presentation    Examples
G       Era designator          Text                AD
y       Year                    Year                1996; 96
M       Month in year           Month               July; Jul; 07
w       Week in year            Number              27
W       Week in month           Number              2
D       Day in year             Number              189
d       Day in month            Number              10
F       Day of week in month    Number              2
E       Day in week             Text                Tuesday; Tue
a       Am/pm marker            Text                PM
H       Hour in day (0-23)      Number              0
k       Hour in day (1-24)      Number              24
K       Hour in am/pm (0-11)    Number              0
h       Hour in am/pm (1-12)    Number              12
m       Minute in hour          Number              30
s       Second in minute        Number              55
S       Millisecond             Number              978
z       Time zone               General time zone   Pacific Standard Time; PST; GMT-08:00
Z       Time zone               RFC 822 time zone   -0800 

используйте приведенную ниже функцию

/**
     * Format a time from a given format to given target format
     * 
     * @param inputFormat
     * @param inputTimeStamp
     * @param outputFormat
     * @return
     * @throws ParseException
     */
    private static String TimeStampConverter(final String inputFormat,
            String inputTimeStamp, final String outputFormat)
            throws ParseException {
        return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat(
                inputFormat).parse(inputTimeStamp));
    }

использование образца следующим образом:

    try {
        String inputTimeStamp = "08/16/2011";

        final String inputFormat = "MM/dd/yyyy";
        final String outputFormat = "EEE MMM dd HH:mm:ss z yyyy";

        System.out.println(TimeStampConverter(inputFormat, inputTimeStamp,
                outputFormat));

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

String newstr = "08/16/2011";
SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat format = new SimpleDateFormat("EE MMM dd hh:mm:ss z yyyy");
Calendar c = Calendar.getInstance();
c.setTime(format1.parse(newstr));
System.out.println(format.format(c.getTime()));

очень простой пример.

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
                Date date = new Date();
                Date date1 = new Date();
            try {
                System.out.println("Date1:   "+date1);
                System.out.println("date" + date);

                date = simpleDateFormat.parse("01-01-2013");
                date1 = simpleDateFormat.parse("06-15-2013");

                System.out.println("Date1 is:"+date1);
                System.out.println("date" + date);

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

вы можете решить проблему очень просто, как Сначала преобразовать заданную строку в объект Date например:

java.util.Date date1 = new Date("11/19/2015"); 
SimpleDateFormat formatter = new SimpleDateFormat("MMM dd yyyy HH:mma");
String format = formatter.format(date);
System.out.println(format);

этот кусок кода помогает конвертировать туда и обратно

    System.out.println("Date: "+ String.valueOf(new Date()));
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String stringdate = dt.format(new Date());
    System.out.println("String.valueOf(date): "+stringdate);

    try {
    Date date = dt.parse(stringdate);
    System.out.println("parse date: "+ String.valueOf(date));
    } catch (ParseException e) {
    e.printStackTrace();
    }

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
    System.out.println(LocalDate.parse("08/16/2011", dateFormatter));

выход:

2011-08-16

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

что пошло не так в вашей код?

когда я разбора 08/16/2011 используя ваш фрагмент, я получаю Sun Jan 16 00:08:00 CET 2011. Поскольку строчные mm в течение нескольких минут, я получаю 00:08:00 (8 минут после полуночи), и с прописных DD это для Дня года, я получаю 16 января.

на java.time слишком строки шаблона формата чувствительны к регистру, и нам нужно было использовать верхний регистр MM для месяца и строчного DD для дня месяца.

вопрос: Могу ли я использовать java.время с моей версией Java?

да, java.time отлично работает на Java 6 и позже и на старых и новых устройствах Android.

  • в Java 8 и более поздних версиях и на новых устройствах Android (от уровня API 26, мне сказали) современный API поставляется встроенным.
  • в Java 6 и 7 получите Threeten Backport, backport новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • на (Старше) Android использовать Android издание ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp С подпакетами.

ссылки


String localFormat = android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d");
return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight);

возвращает формат, основанный на языке устройства. Обратите внимание, что getBestDateTimePattern () возвращает "наилучшую локализованную форму данного скелета для данной локали"


вы использовали какой-то ошибки типа. Если вы хотите установить 08/16/2011 на следующей схеме. Это неправильно, потому что

мм расшифровывается как минут используйте мм как это месяцев

DD is неправильно, должно быть dd представляет дней

попробуйте это, чтобы получить результат, который вы хотите получить (Tue Aug 16 "Whatever Time" IST 2011 ),

    String date = "08/16/2011"; //input date as String

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy"); // date pattern

    Date myDate = simpleDateFormat.parse(date); // returns date object 

    System.out.println(myDate); //outputs: Tue Aug 16 00:00:00 IST 2011