Дата календаря у форматі yyyy-MM-dd у 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. Моя мета - порівняти цю дату з іншою датою в моїй базі даних, використовуючи критерії сплячки. Тому мені потрібен об’єкт дати у yyyy-MM-ddформаті.


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

Я відредагував своє запитання .. Вибачте за попередню помилку ..
Саріка.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 GMT.

Коли ви використовуєте щось подібне 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

Вам слід скористатись BackTport ThreeTen

Далі зберігається в історичних цілях (як оригінальна відповідь)

Що ви можете зробити, це відформатувати дату.

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
MadProgrammer

1
У будь-якому випадку повністю видалити часовий пояс з цього об’єкта календаря?
Саріка.S

2
Якщо ви дійсно серйозно ставитесь до маніпуляцій з датою та часом, погляньте на Joda Time , це значно простіше, ніж возитисяCalendar
MadProgrammer

2
@ n13, якщо питання стосувалося маніпулювання датою бази даних або навіть маніпуляції часом, я можу погодитися з вами. Питання полягало у тому, як представити значення дати в конкретному форматі дати
MadProgrammer

1
Добре структурована відповідь - це в основному розділення Model (Date) -View (Format).
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-Time

Аналогічний код за допомогою бібліотеки 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об'єкт, потрібно спершу перетворити його в String, використовуючи власний формат.

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
Ласкаво просимо до SO. Будь ласка, додайте трохи контексту / пояснення, оскільки відповіді лише на код не відповідають нашим стандартам. Див stackoverflow.com/help/how-to-answer
Uwe Allner

0

Я знайшов цей код, де дату порівнюють у форматі для порівняння з полем дати в базі даних ... це може бути корисним для вас ...

Коли ви перетворюєте рядок на дату за допомогою simpledateformat, важко порівняти з полем Date в базах даних mysql.

Отже, конвертуйте дату рядка Java у формат, використовуючи виберіть STR_to_DATE ('yourdate', '% m /% d /% Y') -> у цей формат, тоді ви отримаєте точний формат дати поля mysql date.

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.