Преобразование строки даты в другой формат

У меня есть строка, содержащая дату в формате YYYY-MM-DD.

Как вы посоветуете мне преобразовать его в формат DD-MM-YYYY наилучшим образом?

Вот как я бы наивно это сделал:

import java.util.*;
public class test {
    public static void main(String[] args) {
         String date = (String) args[0]; 
         System.out.println(date); //outputs: YYYY-MM-DD
         System.out.println(doConvert(date)); //outputs: DD-MM-YYYY
    }

    public static String doConvert(String d) {
         String dateRev = "";
         String[] dateArr = d.split("-");
         for(int i=dateArr.length-1 ; i>=0  ; i--) {
             if(i!=dateArr.length-1)
                dateRev += "-";
             dateRev += dateArr[i];
         }
    return dateRev;
    }
}

Но есть ли другой, более элегантный и эффективный способ сделать это? Т.е. используя какую-то встроенную функцию? Мне не удалось найти его, пока я быстро искал API.

Кто-нибудь знает альтернативный способ?


person lobner    schedule 09.07.2011    source источник
comment
Я создал простой способ сделать это. См. stackoverflow.com/a/40042733/4531507   -  person Rahul Sharma    schedule 14.10.2016


Ответы (5)


Используйте 1_:

DateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd");
fromFormat.setLenient(false);
DateFormat toFormat = new SimpleDateFormat("dd-MM-yyyy");
toFormat.setLenient(false);
String dateStr = "2011-07-09";
Date date = fromFormat.parse(dateStr);
System.out.println(toFormat.format(date));
person duffymo    schedule 09.07.2011
comment
Определенно более элегантно. Но вы бы также утверждали, что это более эффективно? Это приложение для Android. И единственные строковые форматы, с которыми работали, - это упомянутые. - person lobner; 10.07.2011
comment
@lobner: а что, если вы хотите сохранить дату? Лучше хранить его как объект Date, а не как String. - person Hovercraft Full Of Eels; 10.07.2011
comment
@Hovercraft: Меня убедили :) с помощью Settings.System. html # DATE_FORMAT Я могу использовать формат даты, выбранный пользователем. Таким образом я делаю объекты Date, и все хорошо. - person lobner; 10.07.2011

Лучше всего использовать объект SimpleDateFormat (API) для преобразования String в объект Date. Затем вы можете преобразовать через другой объект SimpleDateFormat в любое строковое представление, которое вы хотите, что даст вам огромную гибкость.

person Hovercraft Full Of Eels    schedule 09.07.2011

Вот современный ответ.

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");

public static String doConvert(String d) {
    return LocalDate.parse(d).format(formatter);
}

С этим мы можем сделать, например:

    System.out.println(doConvert("2017-06-30"));

Это печатает

30-06-2017

Я использую тот факт, что ваш формат, YYYY-MM-DD, соответствует стандарту ISO 8601, стандарту, который современные классы даты и времени Java «понимают» изначально, поэтому нам не нужен явный форматер для синтаксического анализа, только один для форматирования.

Когда этот вопрос был задан в 2011 году, я бы также дал ответ SimpleDateFormat. Более новый API даты и времени появился в Java 8 в начале 2014 года, а также был перенесен на Java 6 и 7 в проекте ThreeTen-Backport. Для Android см. Проект ThreeTenABP. Так что в наши дни, честно говоря, я не вижу оправдания тому, что все еще использую SimpleDateFormat и Date. Новые классы намного удобнее для программистов и с ними приятно работать.

person Ole V.V.    schedule 30.06.2017

Если вы не ищете преобразование строки в дату и наоборот, и, следовательно, вам не нужно обрабатывать недопустимые даты или что-то еще, манипуляции со строками - самый простой и эффективный способ. Но я гораздо менее читабелен и удобен в обслуживании, чем использование DateFormat.

String dateInNewFormat = dateInOldFormat.substring(8) 
                         + dateInOldFormat.substring(4, 8) 
                         + dateInOldFormat.substring(0, 4)
person JB Nizet    schedule 09.07.2011
comment
На самом деле это решает мою конкретную проблему именно так, как я и предполагал. Просто и элегантно. И поскольку мне, как уже было сказано, не нужны никакие другие форматы, это победитель :) - person lobner; 10.07.2011
comment
@lobner: Я не согласен. Как только вам понадобится что-то в другом формате, вам придется переделывать все заново. Что делать, если вы хотите сохранить дату? Вы сохраняете это как строку? Какой формат? Использование объекта Date обычно предпочтительнее из-за гибкости и универсальности. Это хороший ответ, но это скорее быстрое и грязное решение. - person Hovercraft Full Of Eels; 10.07.2011
comment
@Hovercraft: Я исправлюсь. На самом деле мне нужно было только «быстрое и грязное», но по ходу дела я изменил ответственность и требования приложения. - person lobner; 10.07.2011

import java.util.DateFormat;   

// Convert String Date To Another String Date
public String convertStringDateToAnotherStringDate(String stringdate, String stringdateformat, String returndateformat){        

        try {
            Date date = new SimpleDateFormat(stringdateformat).parse(stringdate);
            String returndate = new SimpleDateFormat(returndateformat).format(date);
            return returndate;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        }

}

//-------
String resultDate = convertStringDateToAnotherStringDate("1997-01-20", "yyyy-MM-dd", "MM/dd/yyyy")
System.out.println(resultDate);

Результат (строка даты): 20.01.1997

person Krunal    schedule 22.06.2017
comment
Хотя в 2011 году, когда мне задали этот вопрос, я согласился бы использовать SimpleDateFormat, сейчас он давно устарел, и гораздо лучше использовать современный API даты и времени Java. - person Ole V.V.; 30.06.2017