Форматирование даты Java?
Я хочу прочитать дату в формате ГГГГ-ММ-ДД.
Но если я введу дату, скажем, например, 2008-1-1, я хочу прочитать ее как 2008-01-01.
Кто-нибудь может мне помочь? заранее спасибо
5 ответов
Или используйте гораздо лучшую Joda Time lib.
DateTime dt = new DateTime();
System.out.println(dt.toString("yyyy-MM-dd"));
// The ISO standard format for date is 'yyyy-MM-dd'
DateTimeFormatter formatter = ISODateTimeFormat.date();
System.out.println(dt.toString(formatter));
System.out.println(formatter.print(dt));
API даты и календаря ужасен.
Решение Adeel прекрасно, если вам нужно использовать встроенную обработку даты / времени в Java, но лично я бы предпочел использовать Joda Time. Когда дело доходит до форматов, основным преимуществом Joda Time является то, что средство форматирования не имеет состояния, поэтому вы можете безопасно делить его между потоками. Образец кода:
DateTimeFormatter parser = DateTimeFormat.forPattern("YYYY-M-D");
DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-DD");
DateTime dt = parser.parseDateTime("2008-1-1");
String formatted = formatter.print(dt); // "2008-01-01"
import java.text.*;
public class Test
{
public static void main(String args[])
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
System.out.println(sdf.parse(args[0]).toString());
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Это работает нормально, независимо от того, пишете ли вы в качестве аргумента "2008-1-1" или "2008-01-01".
java.time
В
java.util
Date-Time API и их API форматирования,
SimpleDateFormat
устарели и подвержены ошибкам. Рекомендуется полностью отказаться от их использования и перейти на современный Date-Time API*.
Кроме того, ниже цитируется уведомление с домашней страницы Joda-Time:
Обратите внимание, что начиная с Java SE 8 и далее пользователям предлагается перейти на java.time (JSR-310) - основную часть JDK, заменяющую этот проект.
Решение с использованием
java.time
, современный API даты и времени:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d", Locale.ENGLISH);
String input = "2008-1-1";
LocalDate date = LocalDate.parse(input, dtfInput);
System.out.println(date);
}
}
Выход:
2008-01-01
Примечания:
- Используйте (который указывает год эры) вместо
Y
(который указывает год, основанный на неделях). - Использовать
d
(который указывает день месяца) вместоD
(который указывает день года). - Для синтаксического анализа сингл может обслуживать как двузначное, так и четырехзначное представление года. Точно так же сингл
M
может обслуживать месяцы как с однозначным, так и с двузначным числом. аналогичным образом обрабатывает другие письма. - Здесь вы можете использовать вместо, но я предпочитаю
u
кy
. - Вы, должно быть, заметили, что я не использовал
DateTimeFormatter
для выходной строки. Это потому, чтоLocalDate#toString
уже возвращает строку в формате ISO-8601 , uuuu-MM-dd (который также является вашим желаемым шаблоном).
Узнайте больше о современном API даты и времени из Trail: Date Time .
* По любой причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который поддерживает большую часть функциональности java.time для Java 6 и 7. Если вы работаете над проектом Android и своим Android API уровень по-прежнему не соответствует Java-8, проверьте API-интерфейсы Java 8+, доступные через десугаринг, и Как использовать ThreeTenABP в Android Project .