Data kalendarza do formatu rrrr-MM-dd w Javie

210

Jak przekonwertować datę kalendarza na yyyy-MM-ddformat.

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();
}

To wytworzy inActiveDate = Wed Sep 26 00:00:00 IST 2012. Ale potrzebuję 2012-09-26. Moim celem jest porównanie tej daty z inną datą w mojej bazie danych przy użyciu kryteriów hibernacji. Potrzebuję więc obiektu daty w yyyy-MM-ddformacie.

Sarika.S
źródło
5
Twój kod jest mylący. Czy starasz się sformatować Datedo yyyy-MM-ddlub analizowania ciąg od yyyy-MM-dddo Datewartości ?? Aby sformatować datę, po prostu użyj format1.format(date), aby ją przeanalizować, użyjformat1.parse(someStringValueInTheCorrectFormat)
MadProgrammer
Zredagowałem swoje pytanie .. Przepraszam za poprzedni błąd ..
Sarika.S
9
jeden liniowiec:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

Odpowiedzi:

342

Java Datejest kontenerem na liczbę milisekund od 1 stycznia 1970 r., 00:00:00 GMT.

Gdy używasz czegoś podobnego System.out.println(date), Java używa Date.toString()do drukowania zawartości.

Jedynym sposobem, aby to zmienić, jest zastąpienie Datei zapewnienie własnej implementacji Date.toString(). Teraz, zanim uruchomisz swoje IDE i spróbujesz tego, nie zrobiłbym tego; skomplikuje to tylko sprawy. Lepiej sformatuj datę do formatu, którego chcesz użyć (lub wyświetlić).

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

Przed Javą 8

Powinieneś korzystać z ThreeTen Backport

Poniższe informacje zostały zachowane do celów historycznych (jako oryginalna odpowiedź)

Co możesz zrobić, to sformatować datę.

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"

To właściwie ta sama data, reprezentowana inaczej.

MadProgrammer
źródło
1
Niby, ale z dużo łatwiejszymCalendar
MadProgrammer
1
W każdym razie, aby całkowicie usunąć strefę czasową z tego obiektu kalendarza?
Sarika.S
2
Jeśli naprawdę poważnie podchodzisz do manipulacji datą i godziną, spójrz na Joda Time , jest to znacznie łatwiejsze niż Calendar
rozwiązywanie
2
@ n13, jeśli pytanie dotyczyło manipulacji datą w bazie danych, a nawet manipulacji czasem, mogę się z tobą zgodzić. Pytanie dotyczyło sposobu reprezentowania wartości daty w określonym formacie daty
MadProgrammer
1
Ładnie ustrukturyzowana odpowiedź - jest to w zasadzie rozdział Model (Data) - Widok (Format).
YoYo
19

Twój kod jest nieprawidłowy. Nie ma potrzeby analizowania daty i zachowaj ją jako obiekt Date.

Możesz sformatować obiekt daty kalendarza, kiedy chcesz go wyświetlić i zachować jako ciąg.

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();
}
Niroshan Abayakoon
źródło
13

java.time

Odpowiedź przez MadProgrammer jest poprawny, zwłaszcza końcówka o Joda-Time . Następca Joda-Time jest teraz wbudowany w Javę 8 jako nowy pakiet java.time . Oto przykładowy kod w Javie 8.

Podczas pracy z datą i godziną (w przeciwieństwie do daty lokalnej) strefa czasowa ma krytyczne znaczenie. Dzień miesiąca zależy od strefy czasowej. Na przykład strefa czasowa w Indiach jest +05:30(pięć i pół godziny przed UTC), podczas gdy Francja jest tylko o godzinę do przodu. Tak więc chwila w nowym dniu w Indiach ma jedną datę, podczas gdy ten sam moment we Francji ma „wczorajszą” datę. Tworzenie ciągów wyjściowych bez informacji o strefie czasowej lub przesunięciu powoduje niejednoznaczność. Poprosiłeś o wyjście RRRR-MM-DD, więc podałem, ale nie polecam. Zamiast ISO_LOCAL_DATEużyłbym ISO_DATEaby uzyskać ten wynik: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 );

Zrzut do konsoli…

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

Po uruchomieniu…

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

Joda-Time

Podobny kod z wykorzystaniem biblioteki Joda-Time , prekursora java.time.

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

ISO 8601

Nawiasem mówiąc, ten format ciągu wejściowego jest formatem standardowym, jednym z kilku przydatnych formatów ciągów daty i godziny zdefiniowanych przez ISO 8601 .

Zarówno Joda-Time, jak i java.time domyślnie używają formatów ISO 8601 podczas analizowania i generowania ciągów reprezentujących różne wartości daty i godziny.

Basil Bourque
źródło
6

java.util.Dateobiekt nie może reprezentować daty w formacie niestandardowym , zamiast tego należy użyć SimpleDateFormat.formatmetody zwracającej string.

String myString=format1.format(date);
adatapost
źródło
2

Aby parsować java.util.Dateobiekt, musisz najpierw przekonwertować go na String, używając własnego formatu.

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

Ale wierzę, że jesteś tutaj zbędny.

ElderMael
źródło
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));

Spowoduje to wyświetlenie daty + 7 dni w formacie miesiąca, dnia i roku w okienku okna JOption.

Rysował
źródło
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);
}
Petr
źródło
2
Witamy w SO. Dodaj kontekst / wyjaśnienie, ponieważ odpowiedzi tylko w kodzie nie spełniają naszych standardów. Zobacz stackoverflow.com/help/how-to-answer
Uwe Allner,
0

Znalazłem ten kod, w którym data jest porównywana w formacie umożliwiającym porównanie z polem daty w bazie danych ... może to być pomocne ...

Podczas konwertowania ciągów na datę przy użyciu formatu simpledate trudno jest porównać z polem Data w bazach danych mysql.

Tak więc przekonwertuj datę ciągu java w formacie przy użyciu wybierz STR_to_DATE ('twoja data', '% m /% d /% Y') -> w tym formacie, a następnie otrzymasz dokładny format daty pola daty mysql.

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

JavaLearner
źródło
3
Odpowiedzi tylko do linków są odradzane w StackOverflow z powodu rot-link i innych problemów. Czy możesz podać podsumowanie informacji z kluczowymi punktami?
Basil Bourque,
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;
    }
Unnati Solanki
źródło