Календарная дата в формате гггг-мм-дд в java


210

Как конвертировать календарную дату в yyyy-MM-ddформат.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);            
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Это будет производить inActiveDate = Wed Sep 26 00:00:00 IST 2012. Но мне нужно это 2012-09-26. Моя цель - сравнить эту дату с другой датой в моей базе данных, используя критерии Hibernate. Поэтому мне нужен объект даты в yyyy-MM-ddформате.


5
Ваш код сбивает с толку. Вы пытаетесь отформатировать , Dateчтобы yyyy-MM-ddили разобрать строку с yyyy-MM-ddдо Dateзначения ?? Чтобы отформатировать дату, просто используйте format1.format(date), чтобы разобрать ее, используйтеformat1.parse(someStringValueInTheCorrectFormat)
MadProgrammer

Я отредактировал свой вопрос .. Извините за предыдущую ошибку ..
Sarika.S

9
один лайнер:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

Ответы:


342

Java Date- это контейнер для количества миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу.

Когда вы используете что-то вроде System.out.println(date), Java использует Date.toString()для печати содержимого.

Единственный способ изменить это - переопределить Dateи предоставить собственную реализацию Date.toString(). Теперь, прежде чем вы запустите свою IDE и попробуете это, я бы не стал; это только усложнит дело. Вам лучше отформатировать дату в формат, который вы хотите использовать (или отображать).

Java 8+

LocalDateTime ldt = LocalDateTime.now().plusDays(1);
DateTimeFormatter formmat1 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(ldt);
// Output "2018-05-12T17:21:53.658"

String formatter = formmat1.format(ldt);
System.out.println(formatter);
// 2018-05-12

До Java 8

Вы должны использовать ThreeTen Backport

Следующее поддерживается в исторических целях (как оригинальный ответ)

Что вы можете сделать, это отформатировать дату.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(cal.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

String formatted = format1.format(cal.getTime());
System.out.println(formatted);
// Output "2012-09-26"

System.out.println(format1.parse(formatted));
// Output "Wed Sep 26 00:00:00 EST 2012"

Это фактически одна и та же дата, представленная по-разному.


1
Calendar
Вроде

1
В любом случае, чтобы полностью удалить часовой пояс из этого объекта календаря?
Sarika.S

2
Если вы действительно серьезно относитесь к манипуляции с датой и временем, взгляните на Joda Time , это значительно проще, чем возитьсяCalendar
MadProgrammer

2
@ n13 если бы вопрос касался манипулирования датой в базе данных или даже манипулирования временем, я мог бы согласиться с вами. Вопрос заключался в том, как представить значение даты в определенном формате даты
MadProgrammer

1
Хорошо структурированный ответ - это в основном разделение Модель (Дата) -Просмотр (Формат).
YoYo

19

Ваш код неверен. Нет смысла разбирать дату и хранить ее как объект Date.

Вы можете отформатировать объект даты календаря, когда вы хотите отобразить и сохранить его в виде строки.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");          
String inActiveDate = null;
try {
    inActiveDate = format1.format(date);
    System.out.println(inActiveDate );
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

13

java.time

Ответ на MadProgrammer правильно, особенно кончик о Joda-времени . Преемник Joda-Time теперь встроен в Java 8 как новый пакет java.time . Вот пример кода в Java 8.

При работе с датой-временем (в отличие от локальной даты) часовой пояс критический. День месяца зависит от часового пояса. Например, часовой пояс Индия является +05:30(пять с половиной часов больше , чем UTC), в то время как Франция только один час вперед. Таким образом, у момента в новом дне в Индии одна дата, а у того же момента во Франции - «вчерашняя» дата. Создание строкового вывода без какой-либо информации о часовом поясе или смещении создает двусмысленность. Вы просили вывод YYYY-MM-DD, поэтому я предоставил, но я не рекомендую его. Вместо того, ISO_LOCAL_DATEчтобы использовать ISO_DATEэтот вывод:2014-02-25+05:30

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( zoneId );

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE; // Caution: The "LOCAL" part means we are losing time zone information, creating ambiguity.
String output = formatterOutput.format( zonedDateTime );

Дамп на консоль…

System.out.println( "zonedDateTime: " + zonedDateTime );
System.out.println( "output: " + output );

Когда беги…

zonedDateTime: 2014-02-25T14:22:20.919+05:30[Asia/Kolkata]
output: 2014-02-25

Joda времени

Аналогичный код с использованием библиотеки Joda-Time , предшественника java.time.

DateTimeZone zone = new DateTimeZone( "Asia/Kolkata" );
DateTime dateTime = DateTime.now( zone );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String output = formatter.print( dateTime );

ISO 8601

Кстати, этот формат вашей входной строки является стандартным форматом, одним из нескольких удобных форматов строки даты и времени, определенных ISO 8601 .

И Joda-Time, и java.time по умолчанию используют форматы ISO 8601 при разборе и генерации строковых представлений различных значений даты и времени.


6

java.util.Dateобъект не может представлять дату в произвольном формате, вместо этого вы должны использовать SimpleDateFormat.formatметод, который возвращает string.

String myString=format1.format(date);

2

Чтобы разобрать java.util.Dateобъект, вы должны сначала преобразовать его в строку, используя свой собственный формат.

inActiveDate = format1.parse(  format1.format(date)  );

Но я верю, что вы здесь избыточны.


2
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date date = c.getTime();
SimpleDateFormat ft = new SimpleDateFormat("MM-dd-YYYY");
JOptionPane.showMessageDialog(null, ft.format(date));

Это отобразит вашу дату + 7 дней в формате месяц, день и год на панели окна JOption.


2
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, date);
    SimpleDateFormat format1 = new SimpleDateFormat("yyyy MM dd");
    String formatted = format1.format(cal.getTime());
    System.out.println(formatted);
}

2
Добро пожаловать в ТАК. Пожалуйста, добавьте некоторый контекст / объяснение, так как ответы только кода не соответствуют нашим стандартам. См stackoverflow.com/help/how-to-answer
Uwe Allner

0

Я нашел этот код, где дата сравнивается в формате для сравнения с полем даты в базе данных ... может быть, это может быть полезно для вас ...

Когда вы преобразуете строку в дату с помощью simpledateformat, ее трудно сравнить с полем Date в базах данных mysql.

Так что конвертируйте строковую дату в формате Java, используя формат select_ST_to_DATE ('yourdate', '% m /% d /% Y') -> в этом формате, тогда вы получите точный формат даты в поле даты mysql.

http://javainfinite.com/java/java-convert-string-to-date-and-compare/


3
Ответы только на ссылки не рекомендуется использовать в StackOverflow из-за проблем с ссылками и других проблем. Можете ли вы дать резюме информации с ключевыми моментами?
Василий Бурк

0
public static String ThisWeekStartDate(WebDriver driver) {
        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println("Before Start Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("Start Date " + CurrentDate);
          return CurrentDate;

    }
    public static String ThisWeekEndDate(WebDriver driver) {

        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println("Before End Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("End Date " + CurrentDate);
          return CurrentDate;
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.