Разбирайте этот тип формата даты в Java? [Дубликат

StackOverflow https://stackoverflow.com/questions/4013681

  •  26-09-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

Какой был бы самый простой способ разбирать этот формат даты ниже в Java?:

2010-09-18T10:00:00.000+01:00

Я прочитал API DateFormat в Java и не смог найти метод, который принимает строку или даже этот тип формата дата в качестве параметратера для анализа? Когда я имею в виду под анализом, я имею в виду, я хочу извлечь «дату (дневной месяц и год)», «время» и «часовой пояс» на отдельные струнные объекты.

заранее спасибо

Это было полезно?

Решение

Другой ответ, так как вы, кажется, сосредоточены на простой рвении String Помимо (не хорошая идея, ИМХО) Давайте предположим, что строка действительна ISO8601. Можете ли вы предположить, что это будет всегда Будьте в форме, которую вы цитируете, или просто действительно 8601? Если последний, вы должны справиться с кучей сценариев, как Эти ребята сделали.

Regex они придумали, чтобы проверить альтернативы 8601:

^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])
 (-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])
 ((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?
 ([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$ 

Выяснение того, как дразнить правильные группы захвата заставляет меня важими. Тем не менее, следующее будет работать для вашего конкретного случая:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Regex8601
{
  static final Pattern r8601 = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T((\\d{2}):"+
                               "(\\d{2}):(\\d{2})\\.(\\d{3}))((\\+|-)(\\d{2}):(\\d{2}))");


  //2010-09-18T10:00:00.000+01:00

  public static void main(String[] args)
  {
    String thisdate = "2010-09-18T10:00:00.000+01:00";
    Matcher m = r8601.matcher(thisdate);
    if (m.lookingAt()) {
      System.out.println("Year: "+m.group(1));
      System.out.println("Month: "+m.group(2));
      System.out.println("Day: "+m.group(3));
      System.out.println("Time: "+m.group(4));
      System.out.println("Timezone: "+m.group(9));
    } else {
      System.out.println("no match");
    }
  }
}

Другие советы

Если вы делаете что-то нетривиальное с датами и временами, рекомендуем использовать использование Jodatime.. Отказ Видеть Это обширное, так обсуждение, включая ISO8601.. Отказ Смотрите также «Должен ли я использовать родные данные / время ...».

Вот пример кода фрагмент, взятый из Этот пример, Если вы хотите использовать JDK SimpleDateFormat.

// 2004-06-14T19:GMT20:30Z
// 2004-06-20T06:GMT22:01Z

// http://www.cl.cam.ac.uk/~mgk25/iso-time.html
//    
// http://www.intertwingly.net/wiki/pie/DateTime
//
// http://www.w3.org/TR/NOTE-datetime
//
// Different standards may need different levels of granularity in the date and
// time, so this profile defines six levels. Standards that reference this
// profile should specify one or more of these granularities. If a given
// standard allows more than one granularity, it should specify the meaning of
// the dates and times with reduced precision, for example, the result of
// comparing two dates with different precisions.

// The formats are as follows. Exactly the components shown here must be
// present, with exactly this punctuation. Note that the "T" appears literally
// in the string, to indicate the beginning of the time element, as specified in
// ISO 8601.

//    Year:
//       YYYY (eg 1997)
//    Year and month:
//       YYYY-MM (eg 1997-07)
//    Complete date:
//       YYYY-MM-DD (eg 1997-07-16)
//    Complete date plus hours and minutes:
//       YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
//    Complete date plus hours, minutes and seconds:
//       YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
//    Complete date plus hours, minutes, seconds and a decimal fraction of a
// second
//       YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)

// where:

//      YYYY = four-digit year
//      MM   = two-digit month (01=January, etc.)
//      DD   = two-digit day of month (01 through 31)
//      hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
//      mm   = two digits of minute (00 through 59)
//      ss   = two digits of second (00 through 59)
//      s    = one or more digits representing a decimal fraction of a second
//      TZD  = time zone designator (Z or +hh:mm or -hh:mm)
public static Date parse( String input ) throws java.text.ParseException 
{
  //NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks
  //things a bit.  Before we go on we have to repair this.
  SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssz" );

  //this is zero time so we need to add that TZ indicator for 
  if ( input.endsWith( "Z" ) ) {
    input = input.substring( 0, input.length() - 1) + "GMT-00:00";
  } else {
    int inset = 6;

    String s0 = input.substring( 0, input.length() - inset );
    String s1 = input.substring( input.length() - inset, input.length() );    

    input = s0 + "GMT" + s1;
  }

  return df.parse( input );        
}

Эта дата в ISO 8601 Формат. Отказ Вот Ссылка на анализатор, специфичный для этого формата Это использует Java SimpledateFormat API на анализ API внутри.

Вы должны использовать SimpleDateFormat.,

Найти примеры здесь а также здесь для начала.

Вы можете использовать javax.xml.datatype.DatatypeFactory#newXMLGregorianCalendar(String lexicalRepresentation) (API Docs.). Возвращенный XMLGregoriancalendar дает вам доступ ко всем отдельным полям.

Использовать SimpleDateFormat., с рисунком как yyy-MM-dd'T'HH:mm:ss.SSSZ


Обновлять SimpleDateFormat не будет работать с форматом даты ISO 8601. Скорее использовать, Jodatime. вместо. Это обеспечивает Изохронология Это соответствует ISO 8601.

Краткий пример можно найти на ТАК.

Самое простое решение это:

Date date = null;
SimpleDateFormat isoFormatWithMillis = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
try {
    date = isoFormatWithMillis.parse("2010-09-18T10:00:00.000+01:00");
} catch (ParseException e) {
    e.printStackTrace();
}
System.out.println(date);

Это будет печатать Sat Sep 18 11:00:00 CEST 2010.

Если вы используете Java 7 или ранее, вы можете обратиться к этому сообщение.

Если вы используете Java 8, вы можете сделать:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
    TemporalAccessor accessor = timeFormatter.parse("2015-10-27T16:22:27.605-07:00");

    Date date = Date.from(Instant.from(accessor));
    System.out.println(date);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top