В Java є зручний клас SimpleDateFormat, який можна використовувати для форматування дати. В цій статті Ви знайдете огляд парметрів, які приймає методи класу SimpleDateFormat, а також будуть приведені результати виконання методу format з різноманітними параметрами.
Наведемо простий приклад форматування дати з використанням класу SimpleDateFormat:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
*
* @author seostella.com
*/
public class SimpleDateFormatExample {
public static void main(String[] args) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
System.out.println("date: " + dateFormat.format( new Date() ) );
}
}
Якщо на комп'ютері локалізацією за умовчанням є російська локалізація, то в результаті виконання наведеного коду Ви побачите наступне:
date: 2012.02.07 н.э. at 15:13:08 EET
Розглянемо деякі методи класу SimpleDateFormat. Для початку, клас має 4 конструктора:
SimpleDateFormat()
// Створює SimpleDateFormat, використовуючи патерн часу і формат символів за замовчуванням для поточної локалізації
SimpleDateFormat(String pattern)
// Створює SimpleDateFormat, використовуючи заданий патерн часу і формат символів за замовчуванням для поточної локалізації
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
// Створює SimpleDateFormat, використовуючи задані патерн часу і формат символів
SimpleDateFormat(String pattern, Locale locale)
// Створює SimpleDateFormat, використовуючи заданий патерн часу і формат символів за замовчуванням для заданої локалізації
Наступний приклад демонструє роботу всіх чотирьох конструкторів:
package simpledateformatexample;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
*
* @author seostella.com
*/
public class SimpleDateFormatExample {
public static void main(String[] args) {
Date currentDate = new Date();
SimpleDateFormat dateFormat = null;
dateFormat = new SimpleDateFormat();
System.out.println("Constructor 1: " + dateFormat.format( currentDate ) );
dateFormat = new SimpleDateFormat("dd MMMM");
System.out.println("Constructor 2: " + dateFormat.format( currentDate ) );
dateFormat = new SimpleDateFormat("dd MMMM", myDateFormatSymbols );
System.out.println("Constructor 3: " + dateFormat.format( currentDate ) );
dateFormat = new SimpleDateFormat("dd MMMM", Locale.ENGLISH);
System.out.println("Constructor 4: " + dateFormat.format( currentDate ) );
}
private static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){
@Override
public String[] getMonths() {
return new String[]{"января", "февраля", "марта", "апреля", "мая", "июня",
"июля", "августа", "сентября", "октября", "ноября", "декабря"};
}
};
}
Результатом виконання цього коду будуть наступні чотири рядки:
Constructor 1: 07.02.12 15:34
Constructor 2: 07 Февраль
Constructor 3: 07 февраля
Constructor 4: 07 February
Конструктор за замовчуванням використовує паттерн часу і формат символів за замовчуванням для поточної локалізації. Тобто, для російської локалізації стандартним паттерном часу є патерн "dd.MM.yy HH:mm".
Конструктор SimpleDateFormat(String pattern) приймає патерн дати, в якому буде віддавати результат метод format(). У прикладі ми використовували патерн "dd MMMM", який вимагає від format() вивести дату в наступному форматі: "дві цифри дня місяця" + "пробіл" + "назва місяця". В даному випадку використовується назва місяця за замовчуванням для поточної локалізації, тобто, "Февраль".
Конструктор SimpleDateFormat("dd MMMM", myDateFormatSymbols ) аналогічний попередньому за винятком того, що назва місяця використовується не за замовчуванням, а та, яка повертається змінною myDateFormatSymbols. У свою чергу, в змінній myDateFormatSymbols ми перевизначили метод getMonths() щоб він повертав назви місяців з великої букви і в родовому відмінку.
Конструктор SimpleDateFormat("dd MMMM", Locale.ENGLISH) аналогічний конструктору SimpleDateFormat(String pattern), але використовує задану локалізацію. В нашому випадку це англійська локалізація Locale.ENGLISH.
Розглянемо докладно параметри, які приймаєі клас SimpleDateFormat в якості патерну дати.
Символ | Що означає | Приклад |
G | ера (в англійській локалізації - AD і BC) | н.э. |
y | рік (4-х значне число) | 2012 |
yy | рік (останні 2 цифри) | 12 |
yyyy | рік (4-х значне число) | 2012 |
M | номер місяця без лідируючих нулів | 2 |
MM | номер місяця (з лідируючими нулями якщо номер місяця <10) | 02 |
MMM | чотирьохлітерне скорочення назви місяця в російській локалізації та трьохлітерне- в англійській (Feb) | фев |
MMMM | повна назва місяця (в англійській локалізації - February) | Февраль |
w | тиждень у році без лідируючих нулів | 7 |
ww | тиждень у році з лідируючими нулями | 07 |
W | тиждень в місяці без лідируючих нулів | 2 |
WW | тиждень в місяці з лідируючим нулем (якщо це необхідно) | 02 |
D | день у році | 38 |
d | день місяця без лідируючих нулів | 7 |
dd | день місяця з лідируючими нулями | 07 |
F | день тижня у місяці без лідируючих нулів | 1 |
FF | день тижня у місяці з лідируючими нулями | 01 |
E | день тижня (скорочення) | Вт |
EEEE | день тижня (повністю) | вторник |
a | AM/PM покажчик | AM |
H | години в 24-годинному форматі без лідируючих нулів | 6 |
HH | години в 24-годинному форматі з лідируючим нулем | 06 |
k | кількість годин в 24-годинному форматі | 18 |
K | кількість годин в 12-годинному форматі | 6 |
h | час в 12-годинному форматі без лідируючих нулів | 6 |
hh | час в 12-годинному форматі з лідируючим нулем | 06 |
m | хвилини без лідируючих нулів | 32 |
mm | хвилини з лідируючим нулем | 32 |
s | секунди без лідируючих нулів | 11 |
ss | секунди з лідируючим нулем | 11 |
S | мілісекунди | 109 |
z | часовий пояс | EET |
Z | часовий пояс у форматі RFC 822 | +0200 |
' | символ екранування для тексту | 'Date=' |
'' | лапка | 'o''clock' |
Розглянемо кілька прикладів паттернів дати і часу, які представлені в офіційній документації. Російська локалізація:
Паттерн дати і часу | Результат |
"e;yyyy.MM.dd G 'at' HH:mm:ss z"e; | 2012.02.07 н.э. at 16:51:35 EET |
"e;EEE, MMM d, ''yy"e; | Вт, фев 7, '12 |
"e;h:mm a"e; | 4:51 PM |
"e;hh 'o''clock' a, zzzz"e; | 04 o'clock PM, Eastern European Time |
"e;K:mm a, z"e; | 4:51 PM, EET |
"e;yyyyy.MMMMM.dd GGG hh:mm aaa"e; | 02012.Февраль.07 н.э. 04:51 PM |
"e;EEE, d MMM yyyy HH:mm:ss Z"e; | Вт, 7 фев 2012 16:51:35 +0200 |
"e;yyMMddHHmmssZ"e; | 120207165135+0200 |
Англійська локалізація:
Паттерн дати і часу | Результат |
"e;yyyy.MM.dd G 'at' HH:mm:ss z"e; | 2012.02.07 AD at 16:55:57 EET |
"e;EEE, MMM d, ''yy"e; | Tue, Feb 7, '12 |
"e;h:mm a"e; | 4:55 PM |
"e;hh 'o''clock' a, zzzz"e; | 04 o'clock PM, Eastern European Time |
"e;K:mm a, z"e; | 4:55 PM, EET |
"e;yyyyy.MMMMM.dd GGG hh:mm aaa"e; | 02012.February.07 AD 04:55 PM |
"e;EEE, d MMM yyyy HH:mm:ss Z"e; | Tue, 7 Feb 2012 16:55:57 +0200 |
"e;yyMMddHHmmssZ"e; | 120207165557+0200 |
26 листопада 2013 р. 18:48
|
Огромное спасибо за статью! Все описано очень просто, понятно, лаконично и главное с примерами!!!! Удобные таблицы - просто супер!!!
|
21 квітня 2014 р. 15:40
|
Отличная статья, спасибо)
|
3 березня 2015 р. 12:47
|
Я конечно извиняюсь за свою глупость, но что-то я не могу понять как сделать из обычной строки формата "120207165135+0200" читабельную строку в виде "Вт, 7 фев 2012 16:51:35 +0200"
И еще, можно ли математически вычитать/добавлять часы и минуты оперируя часовыми поясами? Например я в часовом поясе +2, но данные мне приходят с пояса +4 и мне надо подкорректировать время под свой пояс. Заранее спасибо. |
31 жовтня 2017 р. 09:22
|