Форматирование даты в Java с помощью SimpleDateFormat

Java

Для форматирования ввода и вывода даты в 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

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий