Низ от ISO-8601 дата и час до брой секунди в Java

Как да конвертирам низ от ISO-8601 datetime (напр.: 2012-05-31T13:48:04Z) в брой секунди (10 digit integer) с помощта на Java?


person yAsH    schedule 02.12.2013    source източник
comment
Няколко секунди откога?   -  person Jon Skeet    schedule 02.12.2013


Отговори (3)


пробвай по този начин

String DateStr="2012-05-31T13:48:04Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date d=sdf.parse(DateStr);
System.out.println(d.getTime());

изход 1338452284000

От коментарите на OP getTime() връща броя милисекунди от 1 януари 1970 г., 00:00:00 GMT, представен от този обект Date.Източник

person SpringLearner    schedule 02.12.2013
comment
Горният резултат в милисекунди ли е? - person yAsH; 02.12.2013
comment
Не виждам къде е 10-цифреното цяло число, което OP търси. Освен това OP иска секундите, а не милисекундите. Освен това това ще даде не. секунди от Epoch. Трябва да споменеш доста неща тук, приятел! :) - person RainMaker; 02.12.2013
comment
@raHul - Да, така е, наистина! - person RainMaker; 02.12.2013
comment
@R.J Бях на път да редактирам няколко неща. Както знаете, не трябва да даваме пълния код, така че просто дадох пример, вероятно намек. Ако кажете, тогава ще предоставя целия код. - person SpringLearner; 02.12.2013
comment
@JqueryLearner - Не казах, че трябва да предоставите целия код (все пак вече предоставихте много). Можеше да споменеш, че е в милисекунди и че трябва да се преобразува в int. Освен това фактът, че дава мили/секунди от Epoch и т.н. - person RainMaker; 02.12.2013
comment
@R.J Благодаря за предложението, редактирах отговора си. Благодаря отново за предложението за по-добър отговор - person SpringLearner; 02.12.2013

използвайки SimpleDateFormat и използвайте формат като yyyy-MM-dd 'T' HH:mm:ss 'Z'

person shreyansh jogi    schedule 02.12.2013

tl;dr

Instant.parse( "2012-05-31T13:48:04Z" )
       .getEpochSecond()

1338472084

Вижте този код, изпълняван на живо в IdeOne.com.

Използване на java.time

Много по-лесно с класовете java.time, които изместват проблемните стари класове за дата-час.

Лесен за анализ на входния низ, тъй като класовете java.time използват формати ISO 8601 по подразбиране при генериране/анализ на низове. Така че няма нужда да указвате шаблон за форматиране.

Класът Instant представлява момент от времева линия в UTC с разделителна способност наносекунди (до девет (9) цифри от десетична дроб).

Instant instant = Instant.parse( "2012-05-31T13:48:04Z" ) ;

Предполагам, че под „секунди“ сте имали предвид броя секунди, изминали от началото на 1970 г. UTC (1970-01-01T00:00:00Z). Класът Instant може да ви каже броя секунди от тази Unix епоха.

long secondsSinceEpoch = instant.getEpochSecond() ;

1338472084

Пазете се от загуба на данни, разбира се. Вие пренебрегвате всяка дробна секунда, която може да присъства във вашата стойност за дата-час.


Относно java.time

Рамката java.time е вграден в Java 8 и по-нови версии. Тези класове изместват проблемните стари наследени класове за дата-час като java.util.Date, Calendar, & SimpleDateFormat.

Проектът Joda-Time, сега в режим на поддръжка, съветва мигриране към java.time класове.

За да научите повече, вижте урока за Oracle. И потърсете в Stack Overflow много примери и обяснения. Спецификацията е JSR 310.

Къде да получа класовете java.time?

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

person Basil Bourque    schedule 29.03.2017