56

I need to get the current timestamp in Java, with the format of MM/DD/YYYY h:mm:ss AM/PM,

For example: 06/01/2000 10:01:50 AM

I need it to be Threadsafe as well.

Can I utilize something like this?

java.util.Date date = new java.util.Date();
System.out.println(new Timestamp(date.getTime()));

Or the examples discussed at the link here.

1
  • 2
    If you create SimpleDateFormat in the scope of a method it will be threadsafe... Commented Dec 1, 2011 at 16:48

11 Answers 11

75

The threadunsafety of SimpleDateFormat should not be an issue if you just create it inside the very same method block as you use it. In other words, you are not assigning it as static or instance variable of a class and reusing it in one or more methods which can be invoked by multiple threads. Only this way the threadunsafety of SimpleDateFormat will be exposed. You can however safely reuse the same SimpleDateFormat instance within the very same method block as it would be accessed by the current thread only.

Also, the java.sql.Timestamp class which you're using there should not be abused as it's specific to the JDBC API in order to be able to store or retrieve a TIMESTAMP/DATETIME column type in a SQL database and convert it from/to java.util.Date.

So, this should do:

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // 12/01/2011 4:48:16 PM
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for your help. This worked, thank you! I appreciate your detailed, concise account of thread safety, with respect to SimpleDateFormat. You're view on Timestamp is use it exclusively for SQL. That makes perfect sense. Thank you for your wisdom.
18

Print a Timestamp in java, using the java.sql.Timestamp.

import java.sql.Timestamp;
import java.util.Date;
 
public class GetCurrentTimeStamp {
    public static void main( String[] args ){
        java.util.Date date= new java.util.Date();
        System.out.println(new Timestamp(date.getTime()));
    }
}

This prints:

2014-08-07 17:34:16.664

Print a Timestamp in Java using SimpleDateFormat on a one-liner.

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

class Runner{
    public static void main(String[] args){

        System.out.println(
            new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date()));

    }

}

Prints:

08/14/2014 14:10:38

Java date format legend:

G Era designation      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

Comments

8

Try this single line solution :

import java.util.Date;
String timestamp = 
    new java.text.SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(new Date());

2 Comments

This works. Writing more than 1 line to do something like this seems ridiculous for a modern language.
@AndrewCowenhoven It is more than 1 line. :D
7

The fact that SimpleDateFormat is not thread-safe does not mean you cannot use it. What that only means is that you must not use a single (potentially, but not necessarily static) instance that gets accessed from several threads at once.

Instead, just make sure you create a fresh SimpleDateFormat for each thread. Instances created as local variables inside a method are safe by definition, because they cannot be reached from any concurrent threads.

You might want to take a look at the ThreadLocal class, although I would recommend to just create a new instance wherever you need one. You can, of course, have the format definition defined as a static final String DATE_FORMAT_PATTERN = "..."; somewhere and use that for each new instance.

1 Comment

I wish I can give you a checkmark, as well, as you deserve one, too. Your knowledge of this subject is invaluable to myself and others who will read this question. Thank you very much for your time and help.
6

java.time

As of Java 8+ you can use the java.time package. Specifically, use DateTimeFormatterBuilder and DateTimeFormatter to format the patterns and literals.

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("MM").appendLiteral("/")
        .appendPattern("dd").appendLiteral("/")
        .appendPattern("yyyy").appendLiteral(" ")
        .appendPattern("hh").appendLiteral(":")
        .appendPattern("mm").appendLiteral(":")
        .appendPattern("ss").appendLiteral(" ")
        .appendPattern("a")
        .toFormatter();
System.out.println(LocalDateTime.now().format(formatter));

The output ...

06/22/2015 11:59:14 AM

Or if you want different time zone

// system default
System.out.println(formatter.withZone(ZoneId.systemDefault()).format(Instant.now()));
// Chicago
System.out.println(formatter.withZone(ZoneId.of("America/Chicago")).format(Instant.now()));
// Kathmandu
System.out.println(formatter.withZone(ZoneId.of("Asia/Kathmandu")).format(Instant.now()));

The output ...

06/22/2015 12:38:42 PM
06/22/2015 02:08:42 AM
06/22/2015 12:53:42 PM

2 Comments

We can also use DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a") to get an instance of DateTimeFormatter :)
It’s more wordy than needed. You may use just DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a");. Or if you want to make it very explicit that the literals are literals: DateTimeFormatter.ofPattern("MM'/'dd'/'yyyy' 'hh':'mm':'ss' 'a")- No matter if you use your version or mine, I consider using java.time an excellent idea.
3

Joda-Time

Here is the same kind of code but using the third-party library Joda-Time 2.3.

In real life, I would specify a time zone, as relying on default zone is usually a bad practice. But omitted here for simplicity of example.

org.joda.time.DateTime now = new DateTime();
org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy h:mm:ss a" );
String nowAsString = formatter.print( now );

System.out.println( "nowAsString: " + nowAsString );

When run…

nowAsString: 11/28/2013 11:28:15 PM

Comments

3

You can make use of java.util.Date with direct date string format:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Comments

3

java.time

The accepted answer uses the legacy API (java.util Date-Time API and their formatting API, SimpleDateFormat) which was the right thing to do at the time of writing that answer. However, Java-8 brought the modern Date-Time API which supplanted the outdated and error-prone legacy date-time API and their formatting API. Since then it has been highly recommended to switch to the modern API.

Also, quoted below is a notice from the home page of Joda-Time:

Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

Note that java.time types are thread-safe.

Solution using java.time, the modern Date-Time API: Format LocalDateTime#now with a DateTimeFormatter using the required format.

LocalDateTime.now()
             .format(
                 DateTimeFormatter.ofPattern(
                     "MM/dd/uuuu hh:mm:ss a", Locale.ENGLISH));

Notes:

  1. Here, you can use y instead of u but I prefer u to y.
  2. Always specify a Locale with a SimpleDateFormat, and a DateTimeFormatter for custom formats.. Note that Predefined Formatters do not accept Locale (i.e. they work with the system's Locale).

Demo:

public class Main {
    public static void main(String[] args) {
        // Get the current date-time in your system's time-zone
        // Note: if you want to get the current date-time in a specific time-zone,
        // use LocalDateTime.now(ZoneId)
        LocalDateTime now = LocalDateTime.now();
        // Default format
        System.out.println(now);

        // Custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uuuu hh:mm:ss a", Locale.ENGLISH);
        String dtInCustomFormat = now.format(formatter);
        System.out.println(dtInCustomFormat);
    }
}

Output from a sample run:

2023-11-13T20:54:51.573121
11/13/2023 08:54:51 PM

ONLINE DEMO

Learn more about the modern Date-Time API from Trail: Date Time.

3 Comments

Good Answer, as always. The phrasing of "Never use a DateTimeFormatter for custom formats, and a SimpleDateFormat without a Locale." seems awkward. Perhaps turn that around to say "Always specify a Locale on your formatter". (a) The positive (always versus never) seems simpler. (b) Shouldn't we specify a locale on all formatters, not just custom formatters? Or did I miss your point.
Thanks, @BasilBourque for your valuable advice! I am going to rephrase that sentence. Regarding Locale for custom formats: The reason why I've mentioned custom formats is that Predefined Formatters do not accept Locale (i.e. they work with system's Locale).
Yes, that is an important point! I suggest you mention that explicitly in your Answer.
1

I did it like this when I wanted a tmiestamp

String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());

Hope it helps :) As a newbie I think it's self-explanatory.

I think you also need import java.text.SimpleDateFormat; header for it to work :))

Comments

-1
String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", dt);

3 Comments

Thank you for your help. Unfortunately, this did not work. I got the error of "The method Format(String, Date) is undefined for the type String". It expects object type, not date type.
Try with a lower-case "f" for String.format(...). Method names in java start with a lower-case letter by convention.
Thank you very much. I tried String str = String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", new Date()); and str takes the value of {0:dddd, MMMM d, yyyy hh:mm tt}. That is, it did not work.
-1

well sometimes this is also useful.

import java.util.Date;
public class DisplayDate {
public static void main(String args[]) {
    // Instantiate an object
    Date date = new Date();
    
    // display time and date
    System.out.println(date.toString());
}

sample output: Mon Jul 03 19:07:15 IST 2017

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.