Jak przekonwertować ciąg znaków na datę za pomocą SimpleDateFormat?

Mam ten fragment kodu:

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

Kiedy uruchamiam to, dostaję to jako wyjście:

Sun Jan 16 00:10:00 IST 2011

Spodziewałem się:

Tue Aug 16 "Whatever Time" IST 2011
To znaczy, że nie dostanę miesiąca zgodnie z oczekiwaniami. Jaki jest błąd?
Author: peterh, 2012-03-26

10 answers

Spróbuj tego:

new SimpleDateFormat("MM/dd/yyyy")
  • MM to "miesiąc" (nie mm)
  • dd to "dzień" (nie DD)

To wszystko w javadoc dla SimpleDateFormat


dla twojej wiadomości, powodem, dla którego twój format jest nadal prawidłowym formatem daty, Jest to, że:

  • mm to "minuty"
  • DD to "dzień w roku"

Poza tym, nie potrzebujesz obsady do Date... it already is a Date (or it "eksploduje"): {]}

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

Wyjście:

Tue Aug 16 00:00:00 EST 2011
Voila!
 85
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 12:55:34

M - min M-miesiące

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 
 38
Author: jahir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-03 10:46:35

Użyj poniższej funkcji

/**
     * 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));
    }

Przykładowe użycie jest następujące:

    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();
    }
 11
Author: Chand Priyankara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 10:18:21
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()));
 6
Author: kandarp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 13:06:44

Bardzo prostym przykładem jest.

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());
            }
 4
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 07:27:50

Możesz rozwiązać ten problem bardzo prosto, jak Najpierw przekonwertuj podany łańcuch na obiekt date eg:

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);
 3
Author: BEN SEBASTIAN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-19 07:48:18

Ten fragment kodu pomaga konwertować tam iz powrotem

    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();
    }
 3
Author: Alfred Ayi-bonte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 07:03:14
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
    System.out.println(LocalDate.parse("08/16/2011", dateFormatter));

Wyjście:

2011-08-16

Dodaję nowoczesną odpowiedź. odpowiedź Bohemian jest poprawna i była dobrą odpowiedzią, gdy została napisana 6 lat temu. Teraz notorycznie kłopotliwa klasa SimpleDateFormat jest od dawna przestarzała i mamy o wiele lepsze w java.time, nowoczesnym Java date and time API. Gorąco polecam używać tego zamiast starych klas daty-czasu.

Co poszło nie tak w Twoim kodzie?

Kiedy analizuję 08/16/2011 używając Twój fragment, Rozumiem Sun Jan 16 00:08:00 CET 2011. Ponieważ małe litery {[5] } oznaczają minuty, dostaję 00:08:00 (8 minut po północy), a duże litery {[7] } oznaczają dzień roku, dostaję 16 stycznia.

W java.time również ciągi wzorców formatu są wrażliwe na wielkość liter i musieliśmy użyć wielkich liter MM dla miesiąca i małych liter dd dla dnia miesiąca.

Pytanie: Czy Mogę używać Javy.czas z moją wersją Javy?

Tak, java.time działa ładnie na Javie 6 i Później oraz na starszym i nowszym Androidzie urządzenia.

    [38]} w Javie 8 i nowszych oraz na nowych urządzeniach z Androidem (od poziomu API 26, Jak mi powiedziano) nowoczesne API jest wbudowane.
  • w Javie 6 i 7 uzyskaj Backport ThreeTen, backport nowych klas (ThreeTen dla JSR 310; zobacz linki na dole).
  • na (starszym) Androidzie Użyj Android edition Threeten Backport. Nazywa się ThreeTenABP. I upewnij się, że zaimportujesz klasy daty i czasu z org.threeten.bp z podpakiety.

Linki

 2
Author: Ole V.V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-07 11:45:51
String localFormat = android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d");
return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight);

Zwróci format oparty na języku urządzenia. Zauważ, że getBestDateTimePattern () zwraca "najlepszą możliwą zlokalizowaną formę podanego szkieletu dla podanego locale"

 1
Author: Dan Alboteanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 22:25:30

Zostały użyte błędy typu . Jeśli chcesz ustawić 08/16/2011 za podążanie za wzorcem. Jest źle, ponieważ,

Mm oznacza minuty , Użyj MM Jak to jest przez miesiące

DD jest źle , powinno być dd co oznacza dni

Spróbuj tego, aby osiągnąć wynik, który chcesz uzyskać ( 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
 1
Author: Dulith De Cozta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 05:25:55