2012-02-06 1 views
0

Может кто-нибудь сказать мне, как преобразовать эту строку 2012-01-01T08:44:36+01:00 в 2012-01-01 08:44:36 в Java?Как конвертировать 2012-01-01T08: 44: 36 + 01: 00 в datetime (yyyy-MM-dd hh: mm: ss) в Java?

Благодаря

+3

См: http://stackoverflow.com/questions/2201925 –

+1

возможно дубликат [Преобразование ISO8601-совместимого строки в java.util.Date] (http://stackoverflow.com/questions/2201925/converting -iso8601-compliant-string-to-java-util-date) – Jacob

ответ

0

Иногда самый простой лучше

String s = "2012-01-01T08:44:36+01:00"; 
// s2 = "2012-01-01 08:44:36" 
String s2 = s.substring(0,10) + ' ' + s.substring(12, 8); 

Таким образом, может производить ошибки с индексами, которые могут стоять, как в вашем примере :-) Кроме того, в случае какой-то плохой строки вы будете тратить много времени, находя ошибка, потому что этот простой способ не имеет проверок ввода строки.

Правильные индексы:

String s2 = s.substring(0,10) + ' ' + s.substring(11, 19); 

Если вы хотите работать с датой, как со строкой, я предпочитаю использовать RegXP:

// You can parse your xml output using regXp: 
    String s = "<root><date>2012-01-01T08:44:36+01:00</date></root>"; 

    Pattern pattern = Pattern.compile("(.+)(T)(.+)([+-])"); 
    Matcher matcher = pattern.matcher(s); 

    if (matcher.find()) { 
     System.out.println(matcher.group(1) + ' ' + matcher.group(3)); 
    } else { 
     System.err.println("Bad date: " + s); 
    } 

Скорость испытания:

public class tempClass { 

    static final String s = "2012-01-01T08:44:36+01:00".intern(); 
    static String formattedDate = null; 
    static final int loop = 5 * 1000; 
    static final String[] patterns = new String[]{"yyyy-MM-dd'T'HH:mm:ss+01:00".intern()}; 

    public static void main(String[] args) throws ParseException, InterruptedException { 
     testSimpleWay(); 
     testRegXp(); 
     testSimpleDateFormat(); 
     testFastDateFormat(); 
    } 

    private static void testRegXp() { 
     Pattern pattern = Pattern.compile("(.+)(T)(.+)([+-])"); 
     Matcher matcher; 

     final long timeStamp = System.currentTimeMillis();    
     for (int i = 0; i < loop; i++) { 
      matcher = pattern.matcher(s); 
      if (matcher.find()) { 
       formattedDate = matcher.group(1) + ' ' + matcher.group(3); 
      } else { 
       System.err.println("Bad date: " + s); 
      } 
     } 
     System.out.println("Duration of RegXP: " + (System.currentTimeMillis() - timeStamp) + " ms."); 
    } 

    private static void testSimpleWay() { 
     long timeStamp = System.currentTimeMillis(); 
     for (int i = 0; i < loop; i++) { 
      formattedDate = s.substring(0, 10) + ' ' + s.substring(11, 19); 
     } 
     System.out.println("Duration of Simple way: " + (System.currentTimeMillis() - timeStamp) + " ms."); 
    } 

    private static void testSimpleDateFormat() { 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 

     final long timeStamp = System.currentTimeMillis(); 
     for (int i = 0; i < loop; i++) { 
      try { 
       formattedDate = simpleDateFormat.format((Date) DateUtils.parseDate(s, patterns)); 
      } catch (ParseException ex) { 
       System.err.println("Bad date: " + s); 
      } 
     } 
     System.out.println("Duration of SimpleDateFormat: " + (System.currentTimeMillis() - timeStamp) + " ms."); 
    } 

    private static void testFastDateFormat() { 
     FastDateFormat fastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); 

     final long timeStamp = System.currentTimeMillis(); 
     for (int i = 0; i < loop; i++) { 
      try { 
       formattedDate = fastDateFormat.format((Date) DateUtils.parseDate(s, patterns)); 
      } catch (ParseException e) { 
       System.err.println("Bad date: " + s); 
      } 
     } 
     System.out.println("Duration of FastDateFormat: " + (System.currentTimeMillis() - timeStamp) + " ms."); 
    } 

Выход:

Duration of Simple way: 5 ms. 
Duration of RegXP: 20 ms. 
Duration of SimpleDateFormat: 114 ms. 
Duration of FastDateFormat: 65 ms. 
+0

Спасибо большое! RegXP решил это !!! – Dejan

+0

Рад помочь ;-) – kornero

0

Используйте SimpleDateFormat класс для форматирования даты.

String value = "2012-01-01T08:44:36+01:00"; 
String date = null; 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
try 
{ 
    Date d = format.parse(value); 
    date = format.format(d); 
} 
catch (ParseException ex) 
{ 
    System.out.println(ex); 
} 
return date 

Более подробную информацию о http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

+0

SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh: mm: ss"); String time1 = ft.format (время); Я пробовал с этим, но безуспешно. Это исключает исключение – Dejan

+0

'SimpleDateFormat format = new SimpleDateFormat (" yyyy-MM-dd hh: mm: ss "); try { Дата d = формат.parse (значение); this.value = format.getCalendar(); this.length = значение.length(); } catch (ParseException ex) { System.out.println (ex); } ' –

+0

Спасибо Сунил за ответ. Возврат из этого кода «d»? Потому что мне нужно вернуть его в виде строки?Будет ли это достаточно "d.toString();" – Dejan

0

Но помните, что, SimpleDateFormat не поточно-. Вы можете использовать FastDateFormat от апача: FastDateFormat

Использование:

// create a formatter that simply prints the year and month 
FastDateFormat formatter = 
    new FastDateFormat("yyyy-MM", 
         TimeZone.getDefault(), 
         Locale.getDefault()); 
// output equals "2012-02" 
String output = formatter.format(new Date()); 

Синтаксический Дата:

FastDateFormat formatter = FastDateFormat.getInstance("yyyy-MM"); 
String s = "2012-01-01T08:44:36+01:00"; 
try { 
    Object o = DateUtils.parseDate(s, new String[]{"yyyy-MM-dd'T'HH:mm:ss+01:00"}); 
    // output equals "2012-01" 
    String output = formatter.format(o); 
} catch (ParseException e) { 
    System.err.println("Bad date: " + s); 
} 
+0

Спасибо, но я не хочу в настоящее время , Я хочу время, которое я даю как некоторый параметр String time = 2012-01-01T08: 44: 36 + 01: 00; Можно ли это сделать с помощью этого FastDateFormat? – Dejan

+0

Сначала вы должны разобрать свою дату. – kornero

0

Иногда самый простой лучше

String s = "2012-01-01T08:44:36+01:00"; 
// s2 = "2012-01-01 08:44:36" 
String s2 = s.substring(0,10) + ' ' + s.substring(11, 19); 
+0

Спасибо за ответ, это полезно, но мой коллега говорит мне, что это плохо для производительности системы, потому что в течение времени будет много мертвых строк в памяти – Dejan

+1

Если вы беспокоитесь о производительности, используя SimpleDateFormat или регулярные выражения создает гораздо больше объектов и намного медленнее. –

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