Нужно получить текущую метку времени в Java - PullRequest
50 голосов
/ 01 декабря 2011

Мне нужно получить текущую метку времени в Java в формате MM/DD/YYYY h:mm:ss AM/PM,

Например: 06/01/2000 10:01:50 AM

Мне нужно, чтобы он также был Threadsafe.

Могу ли я использовать что-то подобное?

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

Или примеры, обсуждаемые по ссылке здесь .

Ответы [ 11 ]

71 голосов
/ 01 декабря 2011

Потокобезопасность SimpleDateFormat не должна быть проблемой, если вы просто создаете ее внутри того же самого блока метода, который используете.Другими словами, вы не назначаете его как статическую переменную или переменную экземпляра класса и повторно используете его в одном или нескольких методах, которые могут быть вызваны несколькими потоками.Только так будет открыта нить безопасности SimpleDateFormat.Однако вы можете безопасно повторно использовать тот же экземпляр SimpleDateFormat в том же блоке метода, к которому будет обращаться только текущий поток.

Кроме того, используемый вами класс java.sql.Timestamp не должен бытьзлоупотреблять, поскольку он специфичен для API JDBC, чтобы иметь возможность сохранять или извлекать тип столбца TIMESTAMP / DATETIME в базе данных SQL и преобразовывать его из / в java.util.Date.

следует сделать:

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
15 голосов
/ 08 августа 2014

Печать отметки времени в java с использованием 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()));
    }
}

Печать:

2014-08-07 17:34:16.664

Печать отметки временив Java с использованием SimpleDateFormat на однострочнике.

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

    }

}

Печать:

08/14/2014 14:10:38

Легенда о формате даты Java:

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
9 голосов
/ 28 ноября 2013

Попробуйте это однострочное решение:

import java.util.Date;
String timestamp = 
    new java.text.SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(new Date());
7 голосов
/ 01 декабря 2011

Тот факт, что SimpleDateFormat не является потокобезопасным, не означает, что вы не можете его использовать.Это означает только то, что вы не должны использовать один (потенциально, но не обязательно static) экземпляр, доступ к которому осуществляется сразу из нескольких потоков.

Вместо этого просто убедитесь, что вы создали новый SimpleDateFormatдля каждой темы.Экземпляры, созданные как локальные переменные внутри метода, безопасны по определению, поскольку к ним нельзя получить доступ ни из каких параллельных потоков.

Вы могли бы захотеть взглянуть на класс ThreadLocal, хотяЯ бы порекомендовал просто создать новый экземпляр там, где он вам нужен.Конечно, вы можете где-нибудь определить определение формата как static final String DATE_FORMAT_PATTERN = "..."; и использовать его для каждого нового экземпляра.

5 голосов
/ 22 июня 2015

java.time

Начиная с Java 8+, вы можете использовать java.time пакет . В частности, используйте DateTimeFormatterBuilder и DateTimeFormatter для форматирования шаблонов и литералов.

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

Выход ...

06/22/2015 11:59:14 AM

Или если вы хотите другой часовой пояс

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

Выход ...

06/22/2015 12:38:42 PM
06/22/2015 02:08:42 AM
06/22/2015 12:53:42 PM
3 голосов
/ 14 июня 2017

Вы можете использовать java.util.Date с прямым форматом строки даты:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
2 голосов
/ 29 ноября 2013

Joda-Time

Вот тот же код, но с использованием сторонней библиотеки Joda-Time 2.3.

В реальной жизни я бы указал часовой пояс , поскольку использование зоны по умолчанию обычно является плохой практикой.Но здесь для простоты опущено.

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

При запуске ...

nowAsString: 11/28/2013 11:28:15 PM
1 голос
/ 12 сентября 2016

Я сделал это так, когда хотел tmiestamp

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

Надеюсь, это поможет :) Как новичок, я думаю, это само за себя

Я думаю, вам также нужно импортировать java.text.SimpleDateFormat; заголовок чтоб он работал :))

0 голосов
/ 25 мая 2018
    public class TimeStampExample {

        private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());

        public static void main(String[] args) {


        System.out.println(timestamp);

        System.out.println(timestamp.getTime());

        Instant instant = timestamp.toInstant();

        System.out.println(instant);

        System.out.println(instant.toEpochMilli());



            Timestamp timestamp = new Timestamp(System.currentTimeMillis());
            System.out.println(timestamp);


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


            System.out.println(timestamp.getTime());


            System.out.println(sdf.format(timestamp));

        }

    }
0 голосов
/ 03 июля 2017

ну иногда это тоже полезно.

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

пример вывода: Mon Jul 03 19:07:15 IST 2017

...