Как преобразовать дату в формат гггг-мм-дд?

Сб 01 декабря 00:00:00 GMT 2012

Мне нужно преобразовать дату выше в формат ниже

2012-12-01

Как я могу?

я пробовал с помощью следующего метода, но он не работает

public Date ConvertDate(Date date){

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    String s = df.format(date);
    String result = s;
    try {
        date=df.parse(result);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return date;
  }

person User 1531343    schedule 26.12.2012    source источник
comment
в чем смысл этого метода public Date ConvertDate(Date date) ?   -  person vels4j    schedule 26.12.2012
comment
@vels4j возвращает дату в формате гггг-мм-дд   -  person User 1531343    schedule 26.12.2012
comment
@ Одед, я просто торопился, поэтому извини.   -  person User 1531343    schedule 26.12.2012
comment
@KeyBrdBasher я не думаю, что это был дубликат. формат ввода был другим, поэтому я не нашел эту ссылку во время поиска   -  person User 1531343    schedule 26.12.2012
comment
Ввод в вышеупомянутой ссылке — это строка, а у вас — объект Date. Глядя на ответы ниже (и тот, который вы выбрали), я до сих пор не могу понять, как этот вопрос вам не помогает.   -  person Sayan    schedule 26.12.2012
comment
Сб, 01 декабря, 00:00:00 по Гринвичу 2012, я говорю об этом формате ввода.   -  person User 1531343    schedule 27.12.2012
comment
Я думаю, вы неправильно поняли. Date не имеет формата. Вы можете иметь желаемый формат только в String вне Date. См. Все о java.util.Date.   -  person Ole V.V.    schedule 22.01.2018


Ответы (5)


Использовать это.

java.util.Date date = new Date("Sat Dec 01 00:00:00 GMT 2012");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String format = formatter.format(date);
System.out.println(format);

вы получите вывод как

2012-12-01
person Nidhish Krishnan    schedule 26.12.2012
comment
+1 и новый метод Date() устарел. вместо этого необходимо использовать Календарь - person vels4j; 26.12.2012
comment
@ vels4j Почему бы вам не поделиться кодом использования Calendar для замены устаревшего конструктора Date? - person mannedear; 24.07.2018

ОБНОВЛЕНИЕ Мой ответ здесь устарел. Проект Joda-Time сейчас находится в режиме обслуживания, поэтому рекомендуется перейти на классы java.time. См. современное решение в Ответе Оле В.В..

Джода-Время

Принятый ответ NidhishKrishnan верен.

Для интереса вот такой же код в Joda-Time 2.3.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

java.util.Date date = new Date(); // A Date object coming from other code.

// Pass the java.util.Date object to constructor of Joda-Time DateTime object.
DateTimeZone kolkataTimeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeInKolkata = new DateTime( date, kolkataTimeZone );

DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MM-dd");
System.out.println( "dateTimeInKolkata formatted for date: " + formatter.print( dateTimeInKolkata ) );
System.out.println( "dateTimeInKolkata formatted for ISO 8601: " + dateTimeInKolkata );

При запуске…

dateTimeInKolkata formatted for date: 2013-12-17
dateTimeInKolkata formatted for ISO 8601: 2013-12-17T14:56:46.658+05:30
person Basil Bourque    schedule 17.12.2013

Современный ответ: используйте LocalDate из java.time, современный API даты и времени Java и его метод toString:

    LocalDate date = LocalDate.of(2012, Month.DECEMBER, 1); // get from somewhere
    String formattedDate = date.toString();
    System.out.println(formattedDate);

Это печатает

2012-12-01

Дата (будь то java.util.Date или java.time.LocalDate) не имеет формата. Все, что у него есть, это метод toString, который создает некоторый формат, и вы не можете изменить метод toString. К счастью, LocalDate.toString выдает именно тот формат, который вы просили.

Класс Date давно устарел, а класс SimpleDateFormat, который вы пытались использовать, известен своей проблемой. Я рекомендую вам забыть об этих классах и использовать вместо них java.time. С современным API гораздо приятнее работать.

За исключением: бывает, что вы получаете Date от устаревшего API, который вы не можете изменить или не хотите менять прямо сейчас. Лучшее, что вы можете с ним сделать, это преобразовать его в java.time.Instant и выполнять оттуда любые дальнейшие операции:

    Date oldfashoinedDate = // get from somewhere
    LocalDate date = oldfashoinedDate.toInstant()
            .atZone(ZoneId.of("Asia/Beirut"))
            .toLocalDate();

Пожалуйста, укажите желаемый часовой пояс, если это не Азия/Бейрут. Затем действуйте, как указано выше.

Ссылка: учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.

person Ole V.V.    schedule 22.01.2018

Вы не можете отформатировать сам Date. Вы можете получить отформатированный результат только в String. Используйте SimpleDateFormat, как упоминалось другими.

Более того, большинство из getter methods in Date являются deprecated.

person Mawia    schedule 26.12.2012

Предполагается, что объект даты и времени хранит информацию о дате, времени, часовом поясе и т. д., не о форматировании. Вы можете отформатировать объект даты и времени в String с выбранным шаблоном, используя API форматирования даты и времени.

  • API форматирования даты и времени для современных типов даты и времени находится в пакете, java.time.format например. java.time.format.DateTimeFormatter, java.time.format.DateTimeFormatterBuilder и т. д.
  • API форматирования даты и времени для устаревших типов даты и времени находится в пакете, java.text например. java.text.SimpleDateFormat, java.text.DateFormat и т. д.

Демонстрация с использованием современного API:

import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.of(LocalDate.of(2012, Month.DECEMBER, 1).atStartOfDay(),
                ZoneId.of("Europe/London"));

        // Default format returned by Date#toString
        System.out.println(zdt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
        String formattedDate = dtf.format(zdt);
        System.out.println(formattedDate);
    }
}

Вывод:

2012-12-01T00:00Z[Europe/London]
2012-12-01

Узнайте о современном API даты и времени из Trail: Date Time.

Демонстрация с использованием устаревшего API:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        calendar.setTimeInMillis(0);
        calendar.set(Calendar.YEAR, 2012);
        calendar.set(Calendar.MONTH, 11);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        Date date = calendar.getTime();

        // Default format returned by Date#toString
        System.out.println(date);

        // Custom format
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
        String formattedDate = sdf.format(date);
        System.out.println(formattedDate);
    }
}

Вывод:

Sat Dec 01 00:00:00 GMT 2012
2012-12-01

Еще несколько важных моментов:

  1. Объект java.util.Date не является реальным объектом даты и времени, как современная дата- типы времени; скорее, он представляет миллисекунды из Epoch of January 1, 1970. Когда вы печатаете объект java.util.Date, его метод toString возвращает дату и время, вычисленные из этого значения в миллисекундах. Поскольку java.util.Date не имеет информации о часовом поясе, он применяет часовой пояс вашей JVM и отображает то же самое. Если вам нужно напечатать дату-время в другом часовом поясе, вам нужно будет установить часовой пояс на SimpleDateFomrat и получить отформатированную строку из него.
  2. The date-time API of java.util and their formatting API, SimpleDateFormat are outdated and error-prone. It is recommended to stop using them completely and switch to the modern date-time API.
person Arvind Kumar Avinash    schedule 03.01.2021