У меня есть строка с форматом даты, например
Jun 13 2003 23:11:52.454 UTC
содержащий миллисекун..., который я хочу преобразовать в эпоху. Есть ли утилита в Java, которую я могу использовать для этого преобразования?
У меня есть строка с форматом даты, например
Jun 13 2003 23:11:52.454 UTC
содержащий миллисекун..., который я хочу преобразовать в эпоху. Есть ли утилита в Java, которую я могу использовать для этого преобразования?
Этот код показывает, как использовать 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()
возвращает время эпохи в миллисекундах.
Вы также можете использовать новый 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
, из которого вы можете извлечь желаемое время эпохи.
Главное преимущество заключается в том, что вы теперь потокобезопасны.
Благодаря Василию Бурку за его замечания и предложения. Прочтите его ответ для получения полной информации.
ZonedDateTime.parse(
"Jun 13 2003 23:11:52.454 UTC" ,
DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" )
)
.toInstant()
.toEpochMilli()
1055545912454
Этот ответ расширяется на Ответ 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-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 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
и больше.
Создать общий метод преобразования формата 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;
}