DateFormat
1. Введение в сегодняшний день
Цель DateFormat - форматировать и разрабатывать «дату/время». На самом деле, это инструмент форматирования для даты. Это может помочь нам форматировать дату, а затем преобразовать дату в строку строки, которую мы хотим, чтобы мы могли использовать. Тем не менее, дата форматирования DateFormat имеет ограниченную функциональность и не так мощна, как SimpleDateFormat; Но DateFormat - родительский класс SimpleDateFormat. Итак, мы сначала имеем всеобъемлющее понимание DateFormat, а затем изучаем SimpleDateFormat.
Функция DateFormat заключается в формате даты. Он поддерживает 4 стиля форматирования, в том числе полный, длинный, средний и короткий:
(01) dateformat.short
Полностью ряд, например, 12.13.52 или 15:30
(02) DateFormat.Medium
Дольше, например, 12 января 1952 года
(03) dateformat.long
Дольше, как 12 января 1952 или 15:30:32
(04) DateFormat.full
Полностью указан, например, вторник, 12 апреля 1952 г. н.э. или 15:30:42 по тихоокеанскому времени.
Определение DateFormat заключается в следующем
Общедоступный абстрактный номер класса Format extends Format {}
Конструктор по умолчанию интерфейса функции DateFormat:
DateFormat ()
Неконструктор:
Object Clone () Boolean Equals (Object Object) Abstract StringBuffer Format (дата дата, буфер stringBuffer, поле FieldPosition) Формат окончательного формирования StringBuffer (объект объекта, буфер StringBuffer, поле FieldPosition) Формат окончательного строкового формата (дата даты) Статический локальный место [] getaVailablelocale () Календарь getCalendar () Финальный дата. GetDateInstance (Int Style) Финальная статическая дата dateFormat getDateInstance (int style, locale locale) окончательная статическая дата формата getDateTimeInstance (int style, locale locale) окончательная статическая дата GetDateTimeInstance (int datesty, int timestyle) Финал DateFormate getDateTimeinstance (int datestyle, финал Timestyle) getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)NumberFormat getNumberFormat()TimeZone getTimeZone()int hashCode()boolean isLenient()Date parse(String string)abstract Date parse(String string, ParsePosition position)Object parseObject(String string, ParsePosition position)void setCalendar(Calendar cal)void setLenient(boolean Значение) void setnumberformat (формат NumberFormat) void setTimezone (часовой часовой застрой)
Примечание: DateFormat - это абстрактный класс.
Когда мы получаем экземпляр DateFormat через getInstance (), getDateInstance () и getDateTimeInstance () DateFormat; Это фактически возвращенный объект SimpleDateFormat.
Следующие функции на самом деле являются возвращенными объектами SimpleDateFormat.
Окончательная статическая дата формата getInstance () окончательный статический dateformat getTimeInstance () окончательный статический dateformat getTimeInstance (int style) окончательный статический дат -формат getTimeInstance (int style, locale locale) final static dateformat getDateInstance () Финал Static DateFormat getDateTimeInstance (int datestyle, int timestyle) окончательная статическая дата getDateTimeInstance (int datestyle, int timestyle, локали локали)
Эти функции определены в SimpleDateFormat.java следующим образом:
Public Static Final int full = 0; public static final int long = 1; public static final int medium = 2; public static final int short = 3; public static final int default = medium; public final Static DateFormat getInstance () {return getDateTimeinstance (короткий, короткий);} public static dateFormat getTimeInc Окончательная статическая дата формата getTimeInstance (int style) {return get (style, 0, 1, locale.getdefault ());} public final Static Dateformat getTimeInstance (int style, locale alocale) {return get (style, 0, 1, alocale);} public static dateformat getDateinStance () {return get, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 Locale.getDefault ());} public final Static DateFormat getDateInstance (int style) {return get (0, style, 2, locale.getdefault ());} public final State DateFormat getDateinStance (int style, locale alocale) {return get (0, стиль, 2, alocale);} get (default, default, 3, locale.getdefault ());} public final Static DateFormat getDateTimeInstance (int datestyle, int timesty) {return get (timestyle, datestyle, 3, locale.getdefault ();} Datestyle, 3, Alocale);}/*** Получить экземпляр DateFormat, который фактически возвращает объект SimpleDateFormat. * * Timestyle - значение может быть «полным» или «длинным» или «средним» или «коротким» * datestyle - значение может быть «полным» или «длинным» или «средним» или «коротким» * флагами - значение может быть «1» или «2» или «3». * 1 означает получить «Стиль времени» * 2 означает получить «Стиль даты» * 3 означает получить «время и дата стиля» * loc - объект локализации, представляющий «область» */частная статическая дата Get (int timesty, int datestyle, int flags, locale loc) {if (flags & 1)! + timestyle); }} else {timestyle = -1; } if ((flags & 2)! = 0) {if (datestyle <0 || dateStyle> 3) {бросить новый allosalargumentException ("Незаконное стиль даты" + datestyle); }} else {datestyle = -1; } Попробуйте {// Проверьте, может ли провайдер предоставить реализацию, которая ближе // к запрошенной локале, чем то, что может предоставить сама время выполнения Java. SocalServiceProviderPool Pool = LocalServiceProviderPool.getPool (dateFormatProvider.class); if (pool.hasproviders ()) {dateformat providersinstance = pool.getlocalizedObject (dateformatgetter.instance, loc, timestyle, datestyle, flags); if (providersinstance! = null) {return providersinstance; }} вернуть новый SimpleDateFormat (Timestyle, Datestyle, LOC); } catch (hispoorSourceException e) {return new SimpleDateFormat ("m/d/yy h: mm a"); }}Через приведенный выше код мы можем дополнительно понять, что функция DateFormat заключается в формате даты; Помогите нам преобразовать дату в строку строки, которая нам нужна. DateFormat предоставляет очень ограниченные функции, он может поддерживать только четыре формата: полный, длинный, средний и короткий. Более того, когда мы получаем экземпляр DateFormat, это фактически возвращаемый объект SimpleDateFormat.
2. Экземпляр DateFormat
Ниже мы изучаем широко используемые API с использованием DateFormat через примеры.
Исходный код заключается в следующем (dateformattest.java):
import java.util.Date;import java.util.Locale;import java.text.DateFormat;import java.text.FieldPosition;/** * API test program for DateFormat*/public class DateFormatTest { public static void main(String[] args) { // Show only "time": Call getTimeInstance() function testGetTimeInstance(); // показывать только «дата»: вызов getDateInstance () function testgetDateInstance (); // показать «дату» + «время»: вызов getDateTimeInstance () function testgetDateTimeInstance (); // test format () function testformat (); } / ** * Проверьте функцию getTimeInstance () DateFormat * Это имеет 3 перегруженные формы: * (01) getTimeInstance () * (02) getTimeInstance (int style) * (03) getTimeInstance (int style, локал локала) * * @author Skywang * / private static void -testgettimeinstance () {дата. // locale locale = new locale ("fr", "fr"); Locale locale = new locale ("zh", "cn"); // эквивалент на DateFormat.getTimeInstance (dateFormat.Medium); DateFormat short0 = dateFormat.getTimeInstance (); // Параметры: «Стиль времени отображения времени» dateformat short1 = dateformat.gettimeInstance (dateformat.short); DateFormat Medium1 = dateFormat.getTimeInstance (dateFormat.Medium); DateFormat long1 = dateFormat.getTimeInstance (dateFormat.long); DateFormat full1 = dateFormat.getTimeInstance (dateFormat.full); // Параметры: «Стиль отображения DateFormat» и «Region» dateFormat short2 = dateFormat.getTimeInstance (dateformat.short, locale); DateFormat Medium2 = dateFormat.getTimeInstance (DateFormat.Medium, Locale); DateFormat long2 = dateFormat.getTimeInstance (dateFormat.long, locale); DateFormat full2 = dateFormat.getTimeInstance (dateFormat.full, locale); System.out.println ("/n ----- get TimeInstance ---/n" + "(1.0) Пустой парамет:" + short0.format (date) + "/n" + "(2.1) Один парамет (s):" + short1.format (date) + "/n" + "(2.2) один парамет (m):" + medium1.format (date) + "/n" + "(2.2). long1.format (date) + "/n" + "(2.4) Один парамет (f):" + full1.format (date) + "/n" + "(3.1) один парамет (s, l):" + short2.format (date) + "/n" + "(3.2) один парамет (m, l):" + medium2.format (date) + "/n" (3.3): "l):" l): " +" l): "1):" 1): "1):" * long2.format (date) + "/n" + "(3.4) один парамет (f, l):" + full2.format (date) + "/n"); } / ** * Проверьте функцию getDateTimeInstance () DateFormat * Она имеет 3 перегруженные формы: * (01) getDateInstance () * (02) GetDateInstance (int Style) * (03) GetDateInstance (int Style, Locale Locale) * / public StaticeDeTEDATETimeInstance () {Дата. Locale locale = new locale ("zh", "cn"); // эквивалент на сегодняшний день. DateFormat short0 = dateFormat.getDateTimeInstance (); DateFormat short1 = dateFormat.getDateTimeInstance (dateformat.short, dateformat.short); DateFormat Medium1 = dateFormat.getDateTimeInstance (dateformat.medium, dateformat.medium); DateFormat long1 = dateFormat.getDateTimeInstance (dateformat.long, dateformat.long); DateFormat full1 = dateFormat.getDateTimeInstance (dateFormat.full, dateformat.full); DateFormat short2 = dateFormat.getDateTimeInstance (dateformat.short, dateformat.short, locale); DateFormat Medium2 = dateFormat.getDateTimeInstance (dateFormat.Medium, dateFormat.Medium, locale); DateFormat long2 = dateFormat.getDateTimeInstance (dateFormat.long, dateFormat.Long, locale); DateFormat full2 = dateFormat.getDateTimeInstance (dateFormat.full, dateFormat.full, locale); System.out.println ("/n ----- getDateTimeInstance ---/n" + "(1.0) Пустой парамет:" + short0.format (date) + "/n" + "(2.1) один парамет (s):" + short1.format (date) + "/n" + "(2.2) один парамец (m):" + medium1. " + long1.format (date) +"/n " +" (2.4) один парамет (f): " + full1.format (date) +"/n " +" (3.1) один парамет (s, l): " + short2.format (date) +"/n " +" (3.2) один парамет (m, l): " + medium2.format (date) +"/n "/n" (3.3): " +" (3.3): " +" (3.3): " +" (3.3): " +" (3.3): " +" (3. 3): " +" (3. 3): " +" (3. 1): " +: 1):". long2.format (date) + "/n" + "(3.4) один парамет (f, l):" + full2.format (date) + "/n"); } / ** * Проверьте функцию getDateInstance () DateFormat * Это имеет 3 перегруженные формы: * (01) getDateTimeInstance () * (02) GetDateTimeInstance (int datestyle, int timestyle) * (03) getDateTimeInstanc = новая дата (); // locale locale = new locale ("en", "us"); Locale locale = new locale ("zh", "cn"); // эквивалент на сегодняшний день. DateFormat short0 = dateFormat.getDateInstance (); DateFormat short1 = dateFormat.getDateInstance (dateformat.short); DateFormat Medium1 = dateFormat.getDateInstance (dateformat.medium); DateFormat long1 = dateFormat.getDateInstance (dateformat.long); DateFormat full1 = dateFormat.getDateInstance (dateFormat.full); DateFormat short2 = dateFormat.getDateInstance (dateformat.short, locale); DateFormat Medium2 = dateFormat.getDateInstance (dateFormat.Medium, locale); DateFormat long2 = dateFormat.getDateInstance (dateformat.long, locale); DateFormat full2 = dateFormat.getDateInstance (dateFormat.full, locale); System.out.println ("/n ---- getDateInstance ----/n" + "(1.0) Пустой парамет:" + short0.format (date) + "/n" + "(2.1) Один парамет (s):" + short1.format (date) + "/n" + "(2.2) один парамет (m):" + medium1.format (date) + "/n" + "(2.2) (m):" + medium1.format (дата) + "/n" (2): " + Medium1.format (date) +"/n "(2):" + Medium1.format (date) + "/n" (2.2): " + Medium1.format (date) +"/n " +" (2.2): ". long1.format (date) + "/n" + "(2.4) Один парамет (f):" + full1.format (date) + "/n" + "(3.1) один парамет (s, l):" + short2.format (date) + "/n" + "(3.2) один парамет (m, l):" + medium2.format (date) + "/n" (3.3): "l):" l): " +" l): "1):" 1): "1):" * long2.format (date) + "/n" + "(3.4) один парамет (f, l):" + full2.format (date) + "/n"); } / *** Дата тестирования формат формата () функция* / public static void testformat () {date date = new Date (); StringBuffer sb = new StringBuffer (); FieldPosition Field = New FieldPosition (dateFormat.year_field); DateFormat format = dateFormat.getDateTimeInstance (); sb = format.format (date, sb, field); System.out.println ("/ntestformat"); System.out.printf ("sb =%s/n", sb); }} Результаты работы:
--- get TimeInstance --- (1.0) Пустой парамет: 4:54:22 вечера (2.1) Один парамет (S): 16:54 PM (2.2) Один парамет (M): 4:54:22 PM (2,3). Один параметр (L): 4:54:22 CST (2.4) один парамет (F): 4:54:22 PM CST (3.1). CST (3.1) Один парамет (S, L): 4:54 (3.2) Один парамет (M, L): 16:54:22 (3.3) Один парамет (L, L): 16:54:22 PM (3,4) Один из параметров (F, L): 4:54:22 PM CST --- GetDateInstance --- (1.0). Параб: 23, 2014 (2.1). Один 1: 1). 23.01.14 (2.2) Один парамет (M): 23 января 2014 г. (2,3) Один парамет (L): 23 января 2014 г. (2.4) Один парамет (F): четверг, 23 января 2014 г. (3.1) Один парамет (S, L): 14-1-23 (3.2) один парамет (M, L): 2014-1-23 (3,3). Один парамец (L, L, L): январь 23, 2014 (3. 4). 23 января 2014 г. --- getDateTimeInstance ---- (1.0) Пустой парамет: 23 января 2014 г. 16:54:23 (2.1) Один парамет (ы): 23.01.14 16:54 (2,2). Один парамет (м): 23 января 2014 г. 4:54:23 вечера (2,3): один парамет): 1 январь 2014 г. 2014 г. 4:54:233. Четверг, 23 января 2014 г., 16:54:23 CST (3.1) Один парамет (S, L): 14-1-23 4:54:23 CST (3.1) Один парамет (S, L): 2014-1-23 16:54:23 (3,3) один парамет (L, L): 04:54:23 (3.4) один парамет CST (3,1) Один парамет (S, L): четверг, 23 января 2014 г., 20:54:23 CSTTESTFORMATSB = 23 января 2014 г. 16:54:23
ХОРОШО. До сих пор изучение DateFormat закончилось. Далее мы начинаем учиться SimpleDateFormat, что вам нужно понять при дате форматирования.
SimpleDateFormat
1. Введение в SimpleDateFormat
SimpleDateFormat - это инструмент для даты форматирования и строк даты анализа. Его наиболее часто используется для форматирования даты в указанном формате, а затем мы используем строки, мы можем отформатировать дату.
Более строго говоря, SimpleDateFormat-это конкретный класс, который форматы и анализации датируются местом, связанным с местом. Это позволяет форматировать (date-> text), анализ (Text-> date) и нормализацию.
SimpleDateFormat Constructor:
Конструктор
SimpleDateFormat () SimpleDateFormat (String Pattern) SimpleDateFormat (String Template, значение DateFormatSymbols) SimpleDateFormat (String Template, Locale Locale)
Неконструктор
void ApplyLocalizePattern (String Template) void ApplyPattern (String Template) Object Clone () Boolean Equals (объект объекта) Формат StringBuffer (дата дата, буфер StringBuffer, FieldPosition FieldPosition) AttributeDharacteriterator Pommordatortorator (объект объекта) get2digityArsatar hashcode () Date Parse (строка строка, позиция Parseposition) void set2digityearstart (дата дата) void setdateformatsymbols (значение dateformatsymbols) string tolocalizepattern () string topattern ()
SimpleDateFormat Простая демонстрация:
// Создать новый объект даты, время-2013-09-19-дневная дата = новая дата (113,8,19); // Создать новый «объект SimpleDateFormat» и установить «режим формата» SDF SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd"); // Дата формата с SDF и вернуть строку. String str = sdf.format (date); 2. Описание формата, связанное с простым, связанное с собой
2.1 Режим даты и времени
Формат даты и времени указывается по строке даты и схемы времени. В строках даты и временных рисунков некватурные буквы «A» to 'Z' и 'A' to 'z' интерпретируются как буквы с шаблонами для представления элементов даты или строки времени. Текст может быть заключен в отдельные кавычки ('), чтобы избежать объяснения. "''" означает отдельные цитаты. Все остальные символы не интерпретируются; Они просто скопируются в выходную строку при отформатировании или соответствуют входной строке при разведе.
Определены следующие буквы с шаблонами (все остальные символы 'A' to 'Z' и 'A' to 'Z сохраняются):
| письмо | Элемент даты или времени | выражать | Пример |
| Герметичный | Эпоха логотип | Текст | ОБЪЯВЛЕНИЕ |
| у | Год | Год | 1996; 96 |
| М | Середина года | Месяц | Июль; Июль; 07 |
| W. | Недели в году | Число | 27 |
| W. | Недели в месяце | Число | 2 |
| Дюймовый | Дни года | Число | 189 |
| дюймовый | Дни месяца | Число | 10 |
| Фон | Неделя месяца | Число | 2 |
| Эн | Дни недели | Текст | Вторник; Вторник |
| а | Tag Am/PM | Текст | Премьер -министр |
| ЧАС | Часы в день (0-23) | Число | 0 |
| k | Часы в день (1-24) | Число | двадцать четыре |
| K | Количество часов в AM/PM (0-11) | Число | 0 |
| час | Количество часов в AM/PM (1-12) | Число | 12 |
| м | Минут в часы | Число | 30 |
| с | Количество секунд за считанные минуты | Число | 55 |
| С | Количество миллисекундов | Число | 978 |
| Z. | Часовой пояс | Общий часовой пояс | Тихоокеанское стандартное время; ТИХООКЕАНСКОЕ СТАНДАРТНОЕ ВРЕМЯ; GMT-08: 00 |
| Z. | Часовой пояс | Часовой пояс RFC 822 | -0800 |
| Режим даты и времени | результат |
| "yyyy.mm.dd G 'At' HH: MM: SS Z" | 2001.07.04 г. н.э. в 12:08:56 PDT |
| "Eee, mmm d, '' yy" | Ср, 4 июля '01 |
| "H: мм" | 12:08 |
| "Hh 'O'Lock' a, zzzz" | 12 часов вечера, тихоокеанское дневное время |
| "K: MM A, Z" | 0:08 вечера, Pdt |
| "yyyyyy.mmmmmmm.dd ggg hh: мм ааа" | 02001.July.04 г. н.э. 12:08 |
| "Eee, D Mmm Yyyy HH: MM: SS Z" | Ср, 4 июля 2001 г. 12:08:56 -0700 |
| "yymmddhhmmssz" | 010704120856-0700 |
| "yyyy-mm-dd't'hh: mm: ss.sssz" | 2001-07-04T12: 08: 56.235-0700 |
Импорт java.util.date; import java.util.locale; import java.util.calendar; import java.text.dateformat; import java.text.simpledateformat;/** * Программа испытаний API stressemed.com * * @author Skywang * @email kuiwutu void main (string [] args) {// Получить дату/время через SimpleDateFormat: Есть несколько форматов для testSimpledAteformats (); // Получить дату/время с DateFormat SuperTest (); } /*** Получить дату /время с SimpleDateFormat. Есть много форматов, которые можно выбрать */ private static void testSimpledateformats () {string [] formats = new String [] {"HH: MM", // 14:22 "H: MM A", // 2:22 PM "HH: MM Z", // 14:22 +0800 "HH: MM Zzzz", // 14:2222. // 14:22 "yyyy-mm-dd", // 2013-09-19 "yyyy-mm-dd hh: mm", // 2013-09-19 14:22 "yyyy-mm-dd hh: mm: ss", // 2013-09-19 14:22:30 "yyyy-mm-dd h: mm: mm: ss zzzze", / /sszzze " /sszzz zzzz /szzze". 2013-09-19 14:22:30 "yyyyyy-mm-dd HH: MM: Ss.sssz", // 2013-09-19 14:22:30 "Yyyy-MM-DD HH: MM: Sssssz", // 2013-09-19 14:22:30 "Yyyy-MM-DD HH: Mmzs" /S.SSSS /S.SSSS /S.SSSS /S.SSSS /S.SSS /S.SSS /S.SS. 2013-09-19T14: 22: 30.000+0800 "yyyyy.mm.dd G 'AT" HH: MM: SS Z ", // 2013.09.19 AD в 14:22:30 CST" K: MM A ", // 2:22 PM, CST" E zzzz ", // 02 часа вечера, CST" yyyyyy.mmmmm.dd GGG HH: MM AAA ", // 02013. 130919142230+0800 "yyyy-MM-dd'T'HH:mm:ss.SSSZ", // 2013-09-19T14:22:30.000+0800 "EEEE 'DATE('yyyy-MM-dd')' 'TIME('HH:mm:ss')' zzzz", // Thursday, 2013-09-19 14:22:30 CST}; // дата дата = (новая дата (0)); // Дата-1970-01-01 07:00:00 // Дата дата = календарь.getInstance (). getTime (); // дата текущей даты времени = новая дата (113, 8, 19, 14, 22, 30); // Дата-2013-09-19 14:22:30 для (строка формата: форматы) {SimplateFormat SDF = new SimpleDateFormat (format, locale.simplied_chinese); // SimpleDateFormat SDF = new SimpleDateFormat (format); System.out.format (« %30s %s/n», Format, sdf.format (date)); }}/*** Получить дату/время через дату формата*/private static void supertest () {// Создать новый объект даты, время 2013-09-19 14:22:30 // (01) Год = " 0 - 1 января - это февраль, и так далее. // (03) день. Число между 1-31 датой mdate = новая дата (113, 8, 19, 14, 22, 30); Locale locale = new locale ("zh", "cn"); // 14:22:30 строка времени = dateformat.gettimeInstance (dateformat.medium, locale.simplied_chinese) .format (mdate); // 2013-09-19 строка дата = dateformat.getDateinstance (dateformat.medium, locale.simplied_chinese) .format (mdate); // 2013-09-19 14:22:30 string dateTime = dateFormat.getDateTimeInstance (dateFormat.Medium, dateFormat.Medium, locale.simplied_chinese) .format (mdate); System.out.printf ("/ntime =%s/ndate =%s/ndateTime =%s/ndateTime =%s/n", время, дата, dateTime); }} Результаты работы:
HH:mm 14:22 h:mm a 2:22 pm HH:mm z 14:22 CST HH:mm Z 14:22 +0800 HH:mm zzzz 14:22 CST HH:mm:ss 14:22:30 yyyy-MM-dd 2013-09-19 yyyy-MM-dd HH:mm 2013-09-19 14:22:30 yyyy-mm-dd HH: MM: SS 2013-09-19 14:22:30 Yyyy-MM-DD HH: MM: SS zzzz 2013-09-19 14:22:30 YYYY-MM-DD HH: MM: SS Zzzz 2013-09-19 14:22:30 YYYY-MM-DD HH: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: MM: SSZZ 2013-09-19 2013-09-19 14:22:30 YYYY-MM-DD HH: MM: SS ZZZZ 2013-09-19 14:22:30 Yeeeee Yyyy-MM-DD HH: MM: SS Zzzz Четверг 2013-09-19 14:22:30 CST K: MM A 2: 22: 30.000+0800. yyyy-mm-dd'hh: MM: Ss.sssz 2013-09-19t14: 22: 30.000+0800 yyyyy.mm.dd G 'At' HH: MM: SS Z 2013.09.19 н.э. a, zzzz 02 часа вечера, yyyyyyy.mmmmmmm.dd ggg hh: mm aaa 02013. 19 сентября 2:22 вечера, д. yyyy-mm-dd't'hh: mm: ss.sssz 2013-09-19t14: 22: 30.000+0800eeee 'Дата (' yyyy-mm-dd ')' 'Время (' HH: MM: SS ')' zzzz gogle Date (2013-09-19) (14:22:30). Время = 14: 22: 30date = 2013-9-19DateTime = 2013-9-19 14:22:30