Форматування дати в Java 8

червня
24
2014

Зміст

В статье описываются методы разбора даты и времени в строковом представлении с использованием нового Java 8 Date-Time Api.

Далее будет рассматриваться только класс LocalDataTime. Если необходимо работать только с временем, используйте класс LocalTime, если только с датой - LocalDate. Все их методы аналогичны методам LocalDateTime. Для начала рассмотрим статические методы of:

Метод Что означает
of(int year, int month, int dayOfMonth, int hour, int minute)Получение объекта LocalDateTime с указанными параметрами
of(int year, int month, int dayOfMonth, int hour, int minute, int second)Получение объекта LocalDateTime с указанными параметрами
of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)Получение объекта LocalDateTime с указанными параметрами
of(int year, Month month, int dayOfMonth, int hour, int minute)Получение объекта LocalDateTime с указанными параметрами, используя множество Month
of(int year, Month month, int dayOfMonth, int hour, int minute, int second)Получение объекта LocalDateTime с указанными параметрами, используя множество Month
of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)Получение объекта LocalDateTime с указанными параметрами, используя множество Month
of(LocalDate date, LocalTime time)Получение объекта LocalDateTime, используя указанные объекты с датой и временем
ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset)Получение объекта LocalDateTime, используя UNIXTIME (количество секунд, прошедших от даты 1970-01-01T00:00:00Z)

Ниже представлен код с примерами всех вышеуказанных методов:


import java.time.*;

public class Main {
	public static void main(String[] args) {
		printlnDate( "0", LocalDateTime.now() );
		printlnDate( "1", LocalDateTime.of( 2014, 6, 25, 13, 24) );
		printlnDate( "2", LocalDateTime.of( 2014, 6, 25, 13, 24, 53) );
		printlnDate( "3", LocalDateTime.of( 2014, 6, 25, 13, 24, 53, 9283475) );
		printlnDate( "4", LocalDateTime.of( 2014, Month.JUNE, 25, 13, 24) );
		printlnDate( "5", LocalDateTime.of( 2014, Month.JUNE, 25, 13, 24, 53) );
		printlnDate( "6", LocalDateTime.of( 2014, Month.JUNE, 25, 13, 24, 53, 9283475) );
		printlnDate( "7", LocalDateTime.of( LocalDate.of(2014, 6, 25), LocalTime.of(13, 24) ) );
		printlnDate( "8", LocalDateTime.ofEpochSecond(System.currentTimeMillis() / 1000, 9812374, ZoneOffset.UTC) );
	}

	private static void printlnDate(String name, LocalDateTime localDateTime) {
		System.out.println( name + ": " + localDateTime );
	}
}

// output:
// 0: 2014-06-25T13:30:43.383
// 1: 2014-06-25T13:24
// 2: 2014-06-25T13:24:53
// 3: 2014-06-25T13:24:53.009283475
// 4: 2014-06-25T13:24
// 5: 2014-06-25T13:24:53
// 6: 2014-06-25T13:24:53.009283475
// 7: 2014-06-25T13:24
// 8: 2014-06-25T10:30:43.009812374

Для разбора даты и времени из строковых значений существует два статических метода parse:

Метод Что означает
parse(CharSequence text)Конвертация строки, которая содержит дату и время, в объект LocalDateTime. При этом используется формат строки вида 2007-12-03T10:15:30
parse(CharSequence text, DateTimeFormatter formatter)Конвертация строки, которая содержит дату и время, в объект LocalDateTime с использованием указанного формата

Ниже приведен код, демонстрирующий эти методы:


import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
	public static void main(String[] args) {
		LocalDateTime firestParseResult = LocalDateTime.parse("2007-12-03T10:15:30");
		LocalDateTime secondParseResult = LocalDateTime.parse("September, 24, 2014 17:18:55", DateTimeFormatter.ofPattern("MMMM, dd, yyyy HH:mm:ss"));
		
		System.out.println("firstParseResult: " + firstParseResult);
		System.out.println("secondParseResult: " + secondParseResult);
	}
}

// output:
// firstParseResult: 2007-12-03T10:15:30
// secondParseResult: 2014-09-24T17:18:55

Как видно из примера, строка "September, 24, 2014 17:18:55" была преобразована в объект LocalDateTime посредством использования метода ofPattern() класса DateTimeFormatter. Рассмотрим подробно параметры, принимаемые классом DateTimeFormatter в качестве паттерна даты.

Символ Что означает Пример
G эра (в английской локализации - AD и BC) н.э.
u год 2014; 14
y год в эре 2014; 14
M/L месяц (название или номер) 9; 09; Sep; September; S
d день месяца 17
Q/q квотер в году 3; 03; Q3; 3rd quarter
Y week-based-year 1996; 96
w номер недели в году 27
W/F номер недели в месяце 2
E день недели Вт; вторник
e/c локализированный день недели 2; 02; Вт, вторник
a AM/PM указатель AM
h время в 12-часовом формате 6
K количество часов в 12-часовом формате 6
k количество часов в 24-часовом формате 18
H часы в 24-часовом формате 6
m минуты 32
s секунды 11
S миллисекунды 109
n наносекунды 987654321
A время в миллисекундах, прошедшее с полуночи 1234
N время в наносекундах, прошедшее с полуночи 1234000000
V идентификатор часового пояса America/Los_Angeles; Z; -08:30
z имя часового пояса Pacific Standard Time; PST
O смещение часового пояса GMT+8; GMT+08:00; UTC-08:00;
X смещение часового пояса Z; -08; -0830; -08:30; -083015; -08:30:15;
x смещение часового пояса +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z смещение часового пояса +0000; -0800; -08:00;
' симфол экранизации текста
'' апостроф
[ старт опциональной секции
] окончание опциональной секции
# зарезервированный символ
{ зарезервированный символ
} зарезервированный символ

Ниже привиден пример форматирования даты с использованием всех возможных паттернов, кроме специальных символов и тех паттернов, что отвечают за разбор дат с часовыми поясами:


import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
	public static void main(String[] args) {
		LocalDateTime dateTime = LocalDateTime.parse(
				"February, 7, 2014 17:8:09.129", 
				DateTimeFormatter.ofPattern("MMMM, d, y H:m:s.SSS")
				);
		String[] patterns = new String[]{"G", "u", "uu", "uuuu", "y", "yy", "yyyy",
				"M", "MM", "MMM", "MMMM", "L", "LL", "LLL", "LLLL",
				"d", 
				"Q", "QQ", "QQQ", "QQQQ", "q", "qq", "qqq", "qqqq",
				"Y", "YY", "YYY", "YYYY", "w", "ww", 
				"W", "F", "E", "EE", "EEE", "EEEE",
				"e", "ee", "eee", "eee", "c", "ccc", "cccc",
				"a", "h", "hh", "K", "KK", "k", "kk", "H", "HH", 
				"m", "mm", "s", "ss", "S", "SS", "SSS", 
				"n", "A", "N"};
		for( String pattern : patterns ){
			printlnDate(dateTime, pattern);
		}
	}

	private static void printlnDate(LocalDateTime dateTime, String pattern) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern( pattern );
		System.out.println( pattern + ": " + dateTime.format( formatter ) );
	}
}

G: AD
u: 2014
uu: 14
uuuu: 2014
y: 2014
yy: 14
yyyy: 2014
M: 2
MM: 02
MMM: Feb
MMMM: February
L: 2
LL: 02
LLL: 2
LLLL: 2
d: 7
Q: 1
QQ: 01
QQQ: Q1
QQQQ: 1st quarter
q: 1
qq: 01
qqq: 1
qqqq: 1
Y: 2014
YY: 14
YYY: 2014
YYYY: 2014
w: 6
ww: 06
W: 2
F: 7
E: Fri
EE: Fri
EEE: Fri
EEEE: Friday
e: 6
ee: 06
eee: Fri
eee: Fri
c: 6
ccc: Fri
cccc: Friday
a: PM
h: 5
hh: 05
K: 5
KK: 05
k: 17
kk: 17
H: 17
HH: 17
m: 8
mm: 08
s: 9
ss: 09
S: 1
SS: 12
SSS: 129
n: 129000000
A: 61689129
N: 61689129000000

Для разбора дат, содержащих часовые пояса, используйте класс ZonedDateTime:


import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
	public static void main(String[] args) {
		ZonedDateTime date = ZonedDateTime.parse(
				"September, 24, 2014 17:18:55 Brazil/East", 
				DateTimeFormatter.ofPattern("MMMM, dd, yyyy HH:mm:ss VV")
		);
		
		System.out.println("date: " + date );		
	}
}

// output:
// date: 2014-09-24T17:18:55-03:00[Brazil/East]

Все ZoneId, которые возвращает метод getAvailableZoneIds():

Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Europe/Zaporozhye, Canada/Yukon, Canada/Atlantic, Atlantic/St_Helena, Australia/Tasmania, Libya, Europe/Guernsey, America/Grand_Turk, US/Pacific-New, Asia/Samarkand, America/Argentina/Cordoba, Asia/Phnom_Penh, Africa/Kigali, Asia/Almaty, US/Alaska, Asia/Dubai, Europe/Isle_of_Man, America/Araguaina, Cuba, Asia/Novosibirsk, America/Argentina/Salta, Etc/GMT+3, Africa/Tunis, Etc/GMT+2, Etc/GMT+1, Pacific/Fakaofo, Africa/Tripoli, Etc/GMT+0, Israel, Africa/Banjul, Etc/GMT+7, Indian/Comoro, Etc/GMT+6, Etc/GMT+5, Etc/GMT+4, Pacific/Port_Moresby, US/Arizona, Antarctica/Syowa, Indian/Reunion, Pacific/Palau, Europe/Kaliningrad, America/Montevideo, Africa/Windhoek, Asia/Karachi, Africa/Mogadishu, Australia/Perth, Brazil/East, Etc/GMT, Pacific/Easter, Antarctica/Davis, Antarctica/McMurdo, Asia/Macao, America/Manaus, Africa/Freetown, Europe/Bucharest, America/Argentina/Mendoza, Asia/Macau, Europe/Malta, Mexico/BajaSur, Pacific/Tahiti, Africa/Asmera, Europe/Busingen, America/Argentina/Rio_Gallegos, Africa/Malabo, Europe/Skopje, America/Catamarca, America/Godthab, Europe/Sarajevo, Australia/ACT, GB-Eire, Africa/Lagos, America/Cordoba, Europe/Rome, Asia/Dacca, Indian/Mauritius, Pacific/Samoa, America/Regina, America/Fort_Wayne, America/Dawson_Creek, Africa/Algiers, Europe/Mariehamn, America/St_Johns, America/St_Thomas, Europe/Zurich, America/Anguilla, Asia/Dili, America/Denver, Africa/Bamako, GB, Mexico/General, Pacific/Wallis, Europe/Gibraltar, Africa/Conakry, Africa/Lubumbashi, Asia/Istanbul, America/Havana, NZ-CHAT, Asia/Choibalsan, America/Porto_Acre, Asia/Omsk, Europe/Vaduz, US/Michigan, Asia/Dhaka, America/Barbados, Europe/Tiraspol, Atlantic/Cape_Verde, Asia/Yekaterinburg, America/Louisville, Pacific/Johnston, Pacific/Chatham, Europe/Ljubljana, America/Sao_Paulo, Asia/Jayapura, America/Curacao, Asia/Dushanbe, America/Guyana, America/Guayaquil, America/Martinique, Portugal, Europe/Berlin, Europe/Moscow, Europe/Chisinau, America/Puerto_Rico, America/Rankin_Inlet, Pacific/Ponape, Europe/Stockholm, Europe/Budapest, America/Argentina/Jujuy, Australia/Eucla, Asia/Shanghai, Universal, Europe/Zagreb, America/Port_of_Spain, Europe/Helsinki, Asia/Beirut, Asia/Tel_Aviv, US/Central, Africa/Sao_Tome, Indian/Chagos, America/Cayenne, Asia/Yakutsk, Pacific/Galapagos, Australia/North, Europe/Paris, Africa/Ndjamena, Pacific/Fiji, America/Rainy_River, Indian/Maldives, Australia/Yancowinna, SystemV/AST4, Asia/Oral, America/Yellowknife, Pacific/Enderbury, America/Juneau, Australia/Victoria, America/Indiana/Vevay, Asia/Tashkent, Asia/Jakarta, Africa/Ceuta, America/Recife, America/Buenos_Aires, America/Noronha, America/Swift_Current, Australia/Adelaide, America/Metlakatla, Africa/Djibouti, America/Paramaribo, Europe/Simferopol, Europe/Sofia, Africa/Nouakchott, Europe/Prague, America/Indiana/Vincennes, Antarctica/Mawson, America/Kralendijk, Europe/Samara, Indian/Christmas, America/Antigua, Pacific/Gambier, America/Indianapolis, America/Inuvik, America/Iqaluit, Pacific/Funafuti, UTC, Antarctica/Macquarie, Canada/Pacific, America/Moncton, Africa/Gaborone, Pacific/Chuuk, Asia/Pyongyang, America/St_Vincent, Asia/Gaza, Etc/Universal, PST8PDT, Atlantic/Faeroe, Asia/Qyzylorda, Canada/Newfoundland, America/Kentucky/Louisville, America/Yakutat, Asia/Ho_Chi_Minh, Antarctica/Casey, Europe/Copenhagen, Africa/Asmara, Atlantic/Azores, Europe/Vienna, ROK, Pacific/Pitcairn, America/Mazatlan, Australia/Queensland, Pacific/Nauru, Europe/Tirane, Asia/Kolkata, SystemV/MST7, Australia/Canberra, MET, Australia/Broken_Hill, Europe/Riga, America/Dominica, Africa/Abidjan, America/Mendoza, America/Santarem, Kwajalein, America/Asuncion, Asia/Ulan_Bator, NZ, America/Boise, Australia/Currie, EST5EDT, Pacific/Guam, Pacific/Wake, Atlantic/Bermuda, America/Costa_Rica, America/Dawson, Asia/Chongqing, Eire, Europe/Amsterdam, America/Indiana/Knox, America/North_Dakota/Beulah, Africa/Accra, Atlantic/Faroe, Mexico/BajaNorte, America/Maceio, Etc/UCT, Pacific/Apia, GMT0, America/Atka, Pacific/Niue, Canada/East-Saskatchewan, Australia/Lord_Howe, Europe/Dublin, Pacific/Truk, MST7MDT, America/Monterrey, America/Nassau, America/Jamaica, Asia/Bishkek, America/Atikokan, Atlantic/Stanley, Australia/NSW, US/Hawaii, SystemV/CST6, Indian/Mahe, Asia/Aqtobe, America/Sitka, Asia/Vladivostok, Africa/Libreville, Africa/Maputo, Zulu, America/Kentucky/Monticello, Africa/El_Aaiun, Africa/Ouagadougou, America/Coral_Harbour, Pacific/Marquesas, Brazil/West, America/Aruba, America/North_Dakota/Center, America/Cayman, Asia/Ulaanbaatar, Asia/Baghdad, Europe/San_Marino, America/Indiana/Tell_City, America/Tijuana, Pacific/Saipan, SystemV/YST9, Africa/Douala, America/Chihuahua, America/Ojinaga, Asia/Hovd, America/Anchorage, Chile/EasterIsland, America/Halifax, Antarctica/Rothera, America/Indiana/Indianapolis, US/Mountain, Asia/Damascus, America/Argentina/San_Luis, America/Santiago, Asia/Baku, America/Argentina/Ushuaia, Atlantic/Reykjavik, Africa/Brazzaville, Africa/Porto-Novo, America/La_Paz, Antarctica/DumontDUrville, Asia/Taipei, Antarctica/South_Pole, Asia/Manila, Asia/Bangkok, Africa/Dar_es_Salaam, Poland, Atlantic/Madeira, Antarctica/Palmer, America/Thunder_Bay, Africa/Addis_Ababa, Europe/Uzhgorod, Brazil/DeNoronha, Asia/Ashkhabad, Etc/Zulu, America/Indiana/Marengo, America/Creston, America/Mexico_City, Antarctica/Vostok, Asia/Jerusalem, Europe/Andorra, US/Samoa, PRC, Asia/Vientiane, Pacific/Kiritimati, America/Matamoros, America/Blanc-Sablon, Asia/Riyadh, Iceland, Pacific/Pohnpei, Asia/Ujung_Pandang, Atlantic/South_Georgia, Europe/Lisbon, Asia/Harbin, Europe/Oslo, Asia/Novokuznetsk, CST6CDT, Atlantic/Canary, America/Knox_IN, Asia/Kuwait, SystemV/HST10, Pacific/Efate, Africa/Lome, America/Bogota, America/Menominee, America/Adak, Pacific/Norfolk, America/Resolute, Pacific/Tarawa, Africa/Kampala, Asia/Krasnoyarsk, Greenwich, SystemV/EST5, America/Edmonton, Europe/Podgorica, Australia/South, Canada/Central, Africa/Bujumbura, America/Santo_Domingo, US/Eastern, Europe/Minsk, Pacific/Auckland, Africa/Casablanca, America/Glace_Bay, Canada/Eastern, Asia/Qatar, Europe/Kiev, Singapore, Asia/Magadan, SystemV/PST8, America/Port-au-Prince, Europe/Belfast, America/St_Barthelemy, Asia/Ashgabat, Africa/Luanda, America/Nipigon, Atlantic/Jan_Mayen, Brazil/Acre, Asia/Muscat, Asia/Bahrain, Europe/Vilnius, America/Fortaleza, Etc/GMT0, US/East-Indiana, America/Hermosillo, America/Cancun, Africa/Maseru, Pacific/Kosrae, Africa/Kinshasa, Asia/Kathmandu, Asia/Seoul, Australia/Sydney, America/Lima, Australia/LHI, America/St_Lucia, Europe/Madrid, America/Bahia_Banderas, America/Montserrat, Asia/Brunei, America/Santa_Isabel, Canada/Mountain, America/Cambridge_Bay, Asia/Colombo, Australia/West, Indian/Antananarivo, Australia/Brisbane, Indian/Mayotte, US/Indiana-Starke, Asia/Urumqi, US/Aleutian, Europe/Volgograd, America/Lower_Princes, America/Vancouver, Africa/Blantyre, America/Rio_Branco, America/Danmarkshavn, America/Detroit, America/Thule, Africa/Lusaka, Asia/Hong_Kong, Iran, America/Argentina/La_Rioja, Africa/Dakar, SystemV/CST6CDT, America/Tortola, America/Porto_Velho, Asia/Sakhalin, Etc/GMT+10, America/Scoresbysund, Asia/Kamchatka, Asia/Thimbu, Africa/Harare, Etc/GMT+12, Etc/GMT+11, Navajo, America/Nome, Europe/Tallinn, Turkey, Africa/Khartoum, Africa/Johannesburg, Africa/Bangui, Europe/Belgrade, Jamaica, Africa/Bissau, Asia/Tehran, WET, Africa/Juba, America/Campo_Grande, America/Belem, Etc/Greenwich, Asia/Saigon, America/Ensenada, Pacific/Midway, America/Jujuy, Africa/Timbuktu, America/Bahia, America/Goose_Bay, America/Virgin, America/Pangnirtung, Asia/Katmandu, America/Phoenix, Africa/Niamey, America/Whitehorse, Pacific/Noumea, Asia/Tbilisi, America/Montreal, Asia/Makassar, America/Argentina/San_Juan, Hongkong, UCT, Asia/Nicosia, America/Indiana/Winamac, SystemV/MST7MDT, America/Argentina/ComodRivadavia, America/Boa_Vista, America/Grenada, Australia/Darwin, Asia/Khandyga, Asia/Kuala_Lumpur, Asia/Thimphu, Asia/Rangoon, Europe/Bratislava, Asia/Calcutta, America/Argentina/Tucuman, Asia/Kabul, Indian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Etc/GMT-14, Etc/GMT-13, W-SU, America/Merida, EET, America/Rosario, Canada/Saskatchewan, America/St_Kitts, Arctic/Longyearbyen, America/Caracas, America/Guadeloupe, Asia/Hebron, Indian/Kerguelen, SystemV/PST8PDT, Africa/Monrovia, Asia/Ust-Nera, Egypt, America/North_Dakota/New_Salem, Asia/Anadyr, Australia/Melbourne, Asia/Irkutsk, America/Shiprock, America/Winnipeg, Europe/Vatican, Asia/Amman, Etc/UTC, SystemV/AST4ADT, Asia/Tokyo, America/Toronto, Asia/Singapore, Australia/Lindeman, America/Los_Angeles, SystemV/EST5EDT, Pacific/Majuro, America/Argentina/Buenos_Aires, Europe/Nicosia, Pacific/Guadalcanal, Europe/Athens, US/Pacific, Europe/Monaco

Дата і час в Java 8. Операції додавання і віднімання >

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі