Подтвердить что ты не робот

Преобразование формата даты в эпоху

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

Jun 13 2003 23:11:52.454 UTC

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

4b9b3361

Ответ 1

Этот код показывает, как использовать 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() возвращает время эпохи в миллисекундах.

Ответ 2

Вы также можете использовать новый 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, из которого вы можете извлечь желаемое время эпохи.

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

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

Ответ 3

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]

Count-из-эпохи

Я не рекомендую отслеживать значения даты-времени как count-from- epoch. Это делает отладку сложной, так как люди не могут распознать значащую дату-время из числа, поэтому недопустимые/неожиданные значения могут проскальзывать. Кроме того, такие подсчеты неоднозначны, в гранулярности (целые секунды, милли, микро, нано и т.д.) И в эпоху (по меньшей мере, две дюжины различных компьютерных систем).

Но если вы настаиваете, вы можете получить счет миллисекунд от эпохи первого момента 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 встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые классы времени, такие как java.util.Date, .Calendar и java.text.SimpleDateFormat.

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

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений.

Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport и далее адаптирована к Android в ThreeTenABP (см. Как использовать...).

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

Ответ 4

Создать общий метод преобразования формата String to Date

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