In this tutorial, we will show you how to convert a String to java.util.Date. Many Java beginners are stuck in the Date conversion, hope this summary guide will helps you in some ways.

    // String -> Date
    SimpleDateFormat.parse(String);

    // Date -> String
    SimpleDateFormat.format(date);

Refer to table below for some of the common date and time patterns used in java.text.SimpleDateFormat, refer to this JavaDoc

LetterDescriptionExamples
yYear2013
MMonth in yearJuly, 07, 7
dDay in month1-31
EDay name in weekFriday, Sunday
aAm/pm markerAM, PM
HHour in day0-23
hHour in am/pm1-12
mMinute in hour0-60
sSecond in minute0-60

Note
You may interest at this Java 8 example – How to convert String to LocalDate

1. String = 7-Jun-2013

If 3 ‘M’, then the month is interpreted as text (Mon-Dec), else number (01-12).

TestDateExample1.java

package com.favtuts.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatMonthWith3M();        
    }

    static void formatMonthWith3M() {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
        String dateInString = "7-Jun-2013";

        try {
            Date date = formatter.parse(dateInString);
            System.out.println(date);
            System.out.println(formatter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Output

Fri Jun 07 00:00:00 ICT 2013
07-Jun-2013

2. String = 07/06/2013

TestDateExample2.java

package com.favtuts.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatMonthWith2M();
    }

    static void formatMonthWith2M() {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        String dateInString = "07/06/2013";

        try {

            Date date = formatter.parse(dateInString);
            System.out.println(date);
            System.out.println(formatter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Output

Fri Jun 07 00:00:00 ICT 2013
07/06/2013

3. String = Fri, June 7 2013

TestDateExample3.java

package com.favtuts.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatDateWithWeekDay();
    }

    static void formatDateWithWeekDay() {
        SimpleDateFormat formatter = new SimpleDateFormat("E, MMM dd yyyy");
        String dateInString = "Fri, June 7 2013";

        try {

            Date date = formatter.parse(dateInString);
            System.out.println(date);
            System.out.println(formatter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Output

Fri Jun 07 00:00:00 ICT 2013
Fri, Jun 07 2013

4. String = Friday, Jun 7, 2013 12:10:56 PM

TestDateExample4.java

package com.favtuts.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatDatetimeWithWeekDay();
    }

    static void formatDatetimeWithWeekDay() {
        SimpleDateFormat formatter = new SimpleDateFormat("EEEE, MMM dd, yyyy HH:mm:ss a");
        String dateInString = "Friday, Jun 7, 2013 12:10:56 PM";

        try {

            Date date = formatter.parse(dateInString);
            System.out.println(date);
            System.out.println(formatter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Output

Fri Jun 07 12:10:56 ICT 2013
Friday, Jun 07, 2013 12:10:56 PM

5. String = 2014-10-05T15:23:01Z

Z suffix means UTC, java.util.SimpleDateFormat doesn’t parse it correctly, you need to replace the suffix Z with ‘+0000’.

TestDateExample5.java

package com.favtuts.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatDatetimeUTC();
    }

    static void formatDatetimeUTC() {
        // Z suffix means UTC, java.util.SimpleDateFormat doesn’t parse it correctly, 
        // you need to replace the suffix Z with ‘+0000’.
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        //String dateInString = "2014-10-05T23:23:01Z";  // -> 2014-10-06T06:23:01+0700
        String dateInString = "2014-10-05T15:23:01Z";  // -> 2014-10-05T22:23:01+0700

        try {

            Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000"));
            System.out.println(date);

            System.out.println("time zone : " + TimeZone.getDefault().getID());
            System.out.println(formatter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Output

Sun Oct 05 22:23:01 ICT 2014
time zone : Asia/Ho_Chi_Minh
2014-10-05T22:23:01+0700

In Java 8, you can convert it into a java.time.Instant object, and display it with a specified time zone.

TestDateExample6.java

package com.favtuts.time;

import java.time.*;

public class StringToDateExamples {
    
    public static void main(String[] args) {
        formatDatetimeUTCWithInstant();
    }

    static void formatDatetimeUTCWithInstant() {
        String dateInString = "2014-10-05T15:23:01Z";

        Instant instant = Instant.parse(dateInString);

        System.out.println(instant);

        //get date time only
        LocalDateTime result = LocalDateTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.getId()));

        System.out.println(result);

        //get date time + timezone
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Africa/Tripoli"));
        System.out.println(zonedDateTime);

        //get date time + timezone
        ZonedDateTime zonedDateTime2 = instant.atZone(ZoneId.of("Europe/Athens"));
        System.out.println(zonedDateTime2);

    }
}

Output

2014-10-05T15:23:01Z
2014-10-05T15:23:01
2014-10-05T17:23:01+02:00[Africa/Tripoli]
2014-10-05T18:23:01+03:00[Europe/Athens]

Download Source Code

$ git clone https://github.com/favtuts/java-core-tutorials-examples

$ cd java-basic/time

References

  1. SimpleDateFormat JavaDoc
  2. Java 8 – How to convert String to LocalDate
  3. Stackoverflow : simpledateformat parsing date with ‘Z’ literal
  4. Wikipedia : ISO 8601
  5. Time Zone and Offset Classes
  6. GMT VS UTC
  7. What is a Time Zone?
  8. Joda Time

Leave a Reply

Your email address will not be published. Required fields are marked *