Як отримати поточний час у форматі РРРР-MM-DD HH: MI: Sec.Millisecond у Java?


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 (YYYY-MM-DD HH: MI: Sec) .

Але я хочу отримати поточний час у форматі 2009-09-22 16:47:08.128((РРРР-ММ-DD HH: MI: Sec.Ms) - де 128 повідомляє мілісекунду.

SimpleTextFormatбуде добре працювати. Тут найнижча одиниця часу - друга, але як я також отримую мілісекунду?


32
Коли все інше не вдається, прочитайте документацію .
Гарячі лизання

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 ("yyyy-MM-dd HH: mm: ss.SSS")?
NickG

10
@NickG Де цей toString(String format)метод? Схоже, java.util.Dateцього немає. Ви посилаєтесь на API часу Joda? Але однією з можливих переваг є повторне використання одного і того ж об’єкта форматера. Інше - вам не потрібно додавати API - Клас дати - це стандартний клас бібліотеки Java.
ADTC

22
У Java 8 ви можете використовувати DateTimeFormatter для тих же цілей.
Віталій Федоренко

7
SimpleDateFormat не є безпечним для потоків, але новіший DateTimeFormatter є безпечним для потоків.
девданке

15
Використання Java 8 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
Maxple

@Порівняти будь-який випадок, коли SimpleDateFormat викликає проблеми?
gaurav




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 під час аналізу / генерації рядків. A Zв кінці короткий для Zulu, і означає UTC .

Позначає 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-Time

Дуже успішна бібліотека 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

Найпростішим способом було (до 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 = 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()));  }

FYI, жахливі старі класи дату, такі як 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

У мене є простий приклад для відображення дати та часу з Millisecond ......

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-річного коментаря rsinha ?
сіра борода


1

Відповідь:

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.