2016-07-08 2 views
4

Я пытаюсь получить свой формат 2016-07-08T00: 00: 00.000Z.Как получить нужный мне час, минуты, секунды и миллисекунды?

String myDate = "20160708"; 
LocalDate myLocalDate = LocalDate.parse(myDate, DateTimeFormatter.BASIC_ISO_DATE); 
OffsetDateTime myOffsetDate = myLocalDate.atTime(OffsetTime.now(ZoneOffset.UTC)); 

System.out.println(myOffsetDate); //2016-07-08T14:58:23.170Z 
+0

Вы имеете в виду, не нужно время, вам просто нужно выводить 'T00: 00: 00.000Z'? – Alexey

+0

Я также пытаюсь вывести дату. – Jon

+0

Я уже понял это) – Alexey

ответ

6

Ну не говорите «Я хочу, чтобы это использовало текущее время»! Это то, что это делает:

OffsetTime.now(ZoneOffset.UTC) 

Если вы просто хотите OffsetDateTime от LocalDate, обеспечивая смещение нулевой точки и в полночь, вы можете использовать:

OffsetDateTime myOffsetDate = myLocalDate 
    .atTime(LocalTime.MIDNIGHT) 
    .atOffset(ZoneOffset.UTC); 

Или, если вы предпочитаете:

OffsetDateTime myOffsetDate = myLocalDate 
    .atTime(OffsetTime.of(LocalTime.MIDNIGHT, ZoneOffset.UTC)); 

(Лично я предпочитаю первую версию, я сам)

Обратите внимание, что это просто дает вам право OffsetDateTime. Если вы хотите форматировать, что с миллисекундах и секундах, вы должны сделать это явно:

DateTimeFormatter formatter = DateTimeFormatter 
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"); 
System.out.println(myOffsetDate.format(formatter)); 

Как было отмечено в комментариях, если вы найдете с ZonedDateTime вместо OffsetDateTime, вы можете использовать

ZonedDateTime myOffsetDate = myLocalDate.atStartOfDay(ZoneOffset.UTC); 
+1

@assylias: True - добавит это. –

+0

Большое спасибо за помощь! – Jon

+0

Есть ли способ сохранить секунды и миллисекунды, когда я пытаюсь преобразовать форматированную строку обратно в OffsetDateTime? Кажется, что он выделяет секунды и миллисекунды, записывая их как OffsetDateTime.parse (formattedString). – Jon

0

Я не совсем уверен, можете ли вы получить формат даты ISO_INSTANCE с заданной строкой с помощью LocalDate. но вы можете использовать ниже java 8 частей кода для получения требуемого формата.

public String getISO_8601DateFormat(String yyyyMMdd){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
    String requiredFormat = null; 
    try { 
     Date inputDate = sdf.parse(yyyyMMdd); 
     long dateLongRepresentation = inputDate.getTime(); 
     long myTimeZoneOffset = TimeZone.getTimeZone(ZoneId.systemDefault()).getOffset(inputDate.getTime()); 
     Instant instance = Instant.ofEpochMilli(dateLongRepresentation + myTimeZoneOffset); 
     requiredFormat = instance.toString(); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return requiredFormat; 
} 

Наслаждайтесь кодирования с Явы :)

+2

Не очень хорошее решение. Вы смешиваете старые классы времени ('Date',' SimpleDateFormat') с их заменами, классы java.time. Старые классы плохо спроектированы, запутаны, сложны и имеют меньшее разрешение (миллисекунды против наносекунд). Избегайте старых классов. См. [Правильный ответ] (http://stackoverflow.com/a/38270241/642706) Джона Скита. Также обратите внимание на тег в вопросе о запросе решения java.time. –

+0

Да, я согласен, решение Jon Skeet намного чище (я очень плохой кодер :() –

+1

Нет, не плохой кодер. В Java есть такая большая библиотека классов, некоторые из которых теперь устарели, что она может Если вы тщательно прочитали JavaDoc в старых классах времени, они попытаются сказать «использовать java.time вместо». –

 Смежные вопросы

  • Нет связанных вопросов^_^