Как получить текущее время в формате ГГГГ-ММ-ДД ЧЧ: МИ: Миллисекунда в Яве?


641

Код ниже дает мне текущее время. Но это ничего не говорит о миллисекундах.

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

Я получаю дату в формате 2009-09-22 16:47:08 (ГГГГ-ММ-ДД ЧЧ: МИ: Сек) .

Но я хочу получить текущее время в формате 2009-09-22 16:47:08.128((ГГГГ-ММ-ДД ЧЧ: MI: Sec.Ms) - где 128 показывает миллисекунду.

SimpleTextFormatбудет работать нормально Здесь самая низкая единица времени - секунда, но как мне получить и миллисекунду?


32
Когда ничего не помогает, прочтите документацию .
Hot Licks

4
FYI, хлопотно старые классы даты и времени , такие как java.util.Date, java.util.Calendarи java.text.SimpleTextFormatтеперь наследие , вытесняется java.time классов. Смотрите Учебник по Oracle .
Василий Бурк

Ответы:


1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Из любопытства, какую пользу приносит использование SimpleDateFormat только для: dateTime.ToString ("гггг-мм-дд чч: мм: сс.ССС")?
NickG

10
@NickG Где этот toString(String format)метод? java.util.Date, Кажется, не имеют его. Вы имеете в виду API Joda Time? Но одним из возможных преимуществ является повторное использование одного и того же объекта форматирования. Во-вторых, вам не нужно добавлять API - класс Date является стандартным классом библиотеки Java.
ADTC

22
В Java 8 вы можете использовать DateTimeFormatter для той же цели.
Виталий Федоренко

7
SimpleDateFormat не является поточно-ориентированным, но более новый DateTimeFormatter является поточно-ориентированным.
Девданке

15
Использование Java 8 datetime API:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha

202

Java один вкладыш

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

в стиле JDK8

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
LocalDateTime и DateTimeFormatter являются поточно-
ориентированными в

@ Укажите любой случай, когда SimpleDateFormat вызывает проблемы?
Гаурав

1
@gaurav вот ваше печенье: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991



31

ТЛ; др

Instant.now()
       .toString()

2016-05-06T23: 24: 25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19: 24: 25.694

java.time

В Java 8 и более поздних версиях у нас есть инфраструктура java.time, встроенная в Java 8 и более поздние версии . Эти новые классы вытесняют проблемные старые классы java.util.Date/.Calendar. Новые классы вдохновлены очень успешной платформой Joda-Time , задуманной как ее преемник, похожей по концепции, но реструктурированной. Определено JSR 310 . Продлевался ThreeTen-Extra проекта. Смотрите учебник .

Имейте в виду, что java.time имеет разрешение наносекунды (9 десятичных знаков в доли секунды) по сравнению с миллисекундами разрешением (3 десятичных разряда) для java.util.Date и Joda-Time. Поэтому при форматировании для отображения только 3 десятичных разрядов вы можете скрывать данные.

Если вы хотите исключить какие-либо микросекунды или наносекунды из ваших данных, обрежьте их.

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

Классы java.time по умолчанию используют формат ISO 8601 при разборе / генерации строк. А Zв конце это сокращение от Zulu, и означает UTC .

An Instantпредставляет момент на временной шкале в UTC с разрешением до наносекунд . Запись текущего момента в Java 8 ограничена миллисекундами , а новая реализация в Java 9 захватывает до наносекунд в зависимости от возможностей аппаратных часов вашего компьютера.

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23: 24: 25.694Z

Замените Tв середине пробел, а на Zничто, чтобы получить желаемый результат.

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23: 24: 25.694

Так как вам не нужно включать смещение или часовой пояс, сделайте «местное» время и дату, не привязанные к какой-либо конкретной местности.

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

Joda времени

Очень успешная библиотека Joda-Time была источником вдохновения для фреймворка java.time. Рекомендуется перейти на java.time, когда это удобно.

Формат ISO 8601 включает миллисекунды и является значением по умолчанию для библиотеки Joda-Time 2.4.

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

Когда беги…

Now: 2013-11-26T20:25:12.014Z

Кроме того, вы можете запросить доли секунды в миллисекундах в виде числа, если это необходимо:

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

Я бы использовал что-то вроде этого:

String.format("%tF %<tT.%<tL", dateTime);

Переменная dateTimeможет быть любой датой и / или значением времени, см. JavaDocFormatter .


9

Самый простой способ был (до Java 8) использовать,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Но SimpleDateFormat не является потокобезопасным. Ни java.util.Date . Это приведет к потенциальным проблемам параллелизма для пользователей. И есть много проблем в этих существующих проектах. Чтобы преодолеть это сейчас в Java 8, у нас есть отдельный пакет с именем java.time . Это Java SE 8 Дата и время содержит хороший обзор.

Таким образом, в Java 8 что-то вроде ниже поможет (для форматирования текущей даты / времени),

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

И стоит отметить, что он был разработан с помощью популярной сторонней библиотеки joda-time ,

Проект был проведен совместно автором Joda-Time (Стивен Коулборн) и Oracle, в рамках JSR 310, и появится в новом пакете Java SE 8 java.time.

Но сейчас joda-timeон становится устаревшим и просит пользователей перейти на новое java.time.

Обратите внимание, что начиная с Java SE 8 пользователей просят перейти на java.time (JSR-310) - основную часть JDK, которая заменяет этот проект.

Во всяком случае, сказав это,

Если у вас есть экземпляр календаря, вы можете использовать ниже, чтобы преобразовать его в новый java.time,

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

Если у вас был объект Date,

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

Если у вас только были эпохи миллисекунд,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

минимальный уровень API 26
AbhinayMe

4

Чтобы дополнить приведенные выше ответы, приведу небольшой рабочий пример программы, которая печатает текущее время и дату, включая миллисекунды.

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

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}


2

Используйте это, чтобы получить ваше текущее время в указанном формате:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .
Василий Бурк

На самом деле я использовал это решение для Android App, но чтобы использовать класс Java.time в Android, нам нужно, чтобы API был установлен как минимум на 27. В любом случае, спасибо за обмен информацией.
Абхишек Сенгупта

Почти все функциональные возможности java.time перенесены на Java 6 и 7 в проекте ThreeTen-Backport с практически одинаковым API. Далее адаптировано под Android <26 в проекте ThreeTenABP . Так что нет никаких причин когда-либо снова трогать эти кровавые ужасные старые классы даты и времени.
Василий Бурк

2

У меня есть простой пример для отображения даты и времени с миллисекундами ......

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}

Выглядит хорошо, но добавляет ли это, скажем, 5-летний комментарий Ринхи ?
глиняный кувшин


1

Ans:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);


0

java.text (до Java 8)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());

-1

Вы можете просто получить его в нужном вам формате.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.