Преобразовать формат даты в эпоху - PullRequest
51 голосов
/ 14 июля 2011

У меня есть строка с форматом даты, например

Jun 13 2003 23:11:52.454 UTC

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

Ответы [ 5 ]

88 голосов
/ 14 июля 2011

Этот код показывает, как использовать java.text.SimpleDateFormat для анализа java.util.Date из строки:

String str = "Jun 13 2003 23:11:52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date date = df.parse(str);
long epoch = date.getTime();
System.out.println(epoch); // 1055545912454

Date.getTime() возвращает время эпохи в миллисекундах.

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

Вы также можете использовать новый Java 8 API

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class StackoverflowTest{
    public static void main(String args[]){
        String strDate = "Jun 13 2003 23:11:52.454 UTC";
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
        ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);        
        System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454  
    }
}

Класс DateTimeFormatter заменяет старый SimpleDateFormat.Затем вы можете создать ZonedDateTime, из которого вы можете извлечь желаемое время эпохи.

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

Благодаря BasilБурк за его замечания и предложения.Прочитайте его ответ для полной информации.

5 голосов
/ 06 октября 2016

tl; dr

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()

1055545912454

java.time

Этот ответ расширяется до Ответа Lockni .

DateTimeFormatter

Сначала определите шаблон форматирования, соответствующий вашей входной строке, создав объект DateTimeFormatter.

String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

Разобрать строку как ZonedDateTime.Вы можете думать об этом классе как: (Instant + ZoneId).

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );

zdt.toString (): 2003-06-13T23: 11: 52.454Z [UTC]

Table of types of date-time classes in modern java.time versus legacy.

Count-from-epoch

I do not recommend tracking date-time values as a count-from- эпоха .Это затрудняет отладку, так как люди не могут различить значащую дату-время из числа, так что недопустимые / неожиданные значения могут ускользнуть.Кроме того, такие подсчеты неоднозначны по степени детализации (целые секунды, милли, микро, нано и т. Д.) И в эпоху (не менее двух десятков в различных компьютерных системах).

Но если вы настаиваете, вы можете получить счет в миллисекундах с эпохи первого момента 1970 года в UTC (1970-01-01T00:00:00) до класса Instant.Имейте в виду, что это означает потерю данных, поскольку вы сокращаете любые наносекунды до миллисекунд.

Instant instant = zdt.toInstant ();

instant.toString (): 2003-06-13T23: 11: 52.454Z

long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454


О java.time

java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 22 марта 2019
  String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 
   DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");
        LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Kolkata");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        long a= zdt.toInstant(zoneOffSet).toEpochMilli();
        Log.d("time","---"+a);

Вы можете получить идентификатор зоны из этой ссылки !

0 голосов
/ 07 июня 2017

Создать общий метод для преобразования строки в формат даты

public static void main(String[] args) throws Exception {
    long test = ConvertStringToDate("May 26 10:41:23", "MMM dd hh:mm:ss");
    long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM", "EEE, MMM dd yyyy, hh:mm a");
    long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC", "MMM dd yyyy HH:mm:ss.SSS zzz");
}

private static long ConvertStringToDate(String dateString, String format) {
    try {
        return new SimpleDateFormat(format).parse(dateString).getTime();
    } catch (ParseException e) {}
    return 0;
}
...