Для форматирования ввода и вывода даты в Java до введения нового Date Time API (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html), который был введен в Java 8, использовался класс SimpleDateFormat.
SimpleDateFormat является подклассом DateFormat, который позволяет форматировать ввод-вывод даты и времени в рамках предопределенных стилей. В отличие от DateFormat, SimpleDateFormat позволяет создавать собственные настраиваемые форматы ввода-вывода.
Для создания экземпляра класса SimpleDateFormat используется один из 4 конструкторов:
SimpleDateFormat()
SimpleDateFormat(String pattern)
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
SimpleDateFormat(String pattern, Locale locale)
pattern – шаблон определяющий формат даты и времени
formatSymbols – символы формата даты (например название месяцев или дней недели)
locale — локаль
SimpleDateFormat чувствителен к локали. При создании экземпляра SimpleDateFormat без параметра Locale, вывод будет форматироваться в соответствии с Locale по умолчанию.
Синтаксис шаблона форматирования даты
Символ | Значение | Представление | Пример |
G | обозначение эры | Текст | AD, н.э. |
y или yyyy | год (4 цифры) | Число | 2017 |
yy | год (2 последние цифры) | Число | 17 |
M | номер месяца без лидирующих нулей | Число | 1, 11 |
MM | номер месяца дополненный нулями | Число | 01, 11 |
MMM | сокращенное название месяца | Текст | дек, Dec |
MMMM | полное название месяца (контекстно-зависимое) | Текст | декабря, December |
LLLL | полное название месяца (контекстно-независимое) | Текст | Декабрь, December |
w | неделя в году | Число | 13 |
W | неделя в месяце | Число | 3 |
D | день в году | Число | 172 |
d | день месяца | Число | 11 |
F | день недели в месяце | Число | 1 |
E | сокращенное название дня недели | Текст | Ср, Wed |
EEEE | полное название дня недели | Текст | среда, Wednesday |
u | номер дня недели (1-пн .. 7-вск) | Число | 3 |
a | маркер am/pm | Текст | AM |
H | Час в дне (0-23) | Число | 0 |
h | Часы в am/pm (1-12) | Число | 12 |
K | час в am/pm (0-11) | Число | 0 |
k | час в дне (1-24) | Число | 24 |
m | минута в часе | Число | 18 |
s | секунда в минуте | Число | 35 |
S | миллисекунды | Число | 978 |
z | часовой пояс | Текст | GMT+07:00 |
Z | часовой пояс в формате RFC 822 | Текст | 700 |
X | часовой пояс в формате ISO 8601 | Текст | 7 |
Символы, не являющиеся буквами обрабатываются как текст в кавычках.
Число используемых буквенных символов также определяет формат:
- Для текстового представления 1-3 символа указывают на сокращенную форму записи, тогда как 4+ символа – на полную форму.
- Для числовых представлений число символов указывает на минимальное требуемое число цифр. Более короткое число дополняется лидирующими нулями.
Пример
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class SimpleDateFormatExample {
public static void main(String[] args) throws ParseException{
Date date = new SimpleDateFormat("y-M-d H:m:s.S").parse("2017-9-11 13:1:28.9");
Locale[] locales = { Locale.getDefault(),
Locale.US,
Locale.FRANCE};
String[] patterns = { "yyyy.MM.dd G 'at' HH:mm:ss z",
"EEE, MMM d, ''yy",
"h:mm a",
"hh 'o''clock' a, zzzz",
"K:mm a, z",
"yyyyy.MMMMM.dd GGG hh:mm aaa",
"EEE, d MMM yyyy HH:mm:ss Z",
"yyMMddHHmmssZ",
"yyyy-MM-dd'T'HH:mm:ss.SSSZ",
"YYYY-'W'ww-u"};
for(String pattern: patterns){
System.out.println(pattern);
for(Locale loc: locales){
System.out.println("\t"+loc+":\t"+new SimpleDateFormat(pattern, loc).format(date));
}
}
System.out.println("По умолчанию");
for(Locale loc: locales){
Locale.setDefault(loc);
System.out.println("\t"+loc+":\t"+new SimpleDateFormat().format(date));
}
}
}
Генерируемый вывод
yyyy.MM.dd G 'at' HH:mm:ss z
ru_RU: 2017.09.11 н.э. at 13:01:28 GMT+07:00
en_US: 2017.09.11 AD at 13:01:28 GMT+07:00
fr_FR: 2017.09.11 ap. J.-C. at 13:01:28 GMT+07:00
EEE, MMM d, ''yy
ru_RU: Пн, сен 11, '17
en_US: Mon, Sep 11, '17
fr_FR: lun., sept. 11, '17
h:mm a
ru_RU: 1:01 PM
en_US: 1:01 PM
fr_FR: 1:01 PM
hh 'o''clock' a, zzzz
ru_RU: 01 o'clock PM, GMT+07:00
en_US: 01 o'clock PM, GMT+07:00
fr_FR: 01 o'clock PM, GMT+07:00
K:mm a, z
ru_RU: 1:01 PM, GMT+07:00
en_US: 1:01 PM, GMT+07:00
fr_FR: 1:01 PM, GMT+07:00
yyyyy.MMMMM.dd GGG hh:mm aaa
ru_RU: 02017.сентября.11 н.э. 01:01 PM
en_US: 02017.September.11 AD 01:01 PM
fr_FR: 02017.septembre.11 ap. J.-C. 01:01 PM
EEE, d MMM yyyy HH:mm:ss Z
ru_RU: Пн, 11 сен 2017 13:01:28 +0700
en_US: Mon, 11 Sep 2017 13:01:28 +0700
fr_FR: lun., 11 sept. 2017 13:01:28 +0700
yyMMddHHmmssZ
ru_RU: 170911130128+0700
en_US: 170911130128+0700
fr_FR: 170911130128+0700
yyyy-MM-dd'T'HH:mm:ss.SSSZ
ru_RU: 2017-09-11T13:01:28.009+0700
en_US: 2017-09-11T13:01:28.009+0700
fr_FR: 2017-09-11T13:01:28.009+0700
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
ru_RU: 2017-09-11T13:01:28.009+07:00
en_US: 2017-09-11T13:01:28.009+07:00
fr_FR: 2017-09-11T13:01:28.009+07:00
YYYY-'W'ww-u
ru_RU: 2017-W38-1
en_US: 2017-W37-1
fr_FR: 2017-W37-1
По умолчанию
ru_RU: 11.09.17 13:01
en_US: 9/11/17 1:01 PM
fr_FR: 11/09/17 13:01