Автор оригинала: Pankaj Kumar.
Иногда нам приходится конвертировать строку в дату в программе java или конвертировать Дату в строку в другом формате для печати.
Преобразовать строку в дату
Вот простой сценарий, в котором нам придется преобразовать строку в дату на Java. Строка является одним из наиболее широко используемых объектов в Java. Если вы работаете в веб-службах или веб-приложениях с формой, вы получаете дату в виде строкового объекта. Поэтому на стороне сервера мы должны преобразовать строку в объект Даты.
Преобразовать дату в строку
Аналогично, при отображении информации о дате на любой веб-странице мы должны преобразовать дату в строку в требуемом формате. Это очень распространенный процесс, и вы увидите ту или иную форму даты почти на всех веб-сайтах.
Преобразование строки в дату в Java
У нас есть некоторые специальные классы в java для форматирования даты в строку. java.text.DateFormat является абстрактным классом для форматирования даты/Времени. java.text.SimpleDateFormat – это конкретный класс, который мы используем для преобразования строки в дату и для преобразования даты в строку в различных форматах.
Давайте посмотрим, как преобразовать строку в дату и преобразовать дату в строку в программе java.
package com.journaldev.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Convert String to Date in Java Example
* Convert Date to String in Java Example
*
* @author pankaj
*
*/
public class DateUtils {
public static void main(String[] args) {
// initialize SimpleDateFormat object
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
// Convert String to Date in java
Date today = sdf.parse("14/11/2012");
System.out.println("Date is : " + today.toString());
// using locale
sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.CHINESE);
DateFormat sdf1 = new SimpleDateFormat("dd-MMM-yyyy", Locale.CANADA_FRENCH);
today = new Date();
System.out.println("Default Date is : " + today.toString());
// Convert Date to String in Java
System.out.println("CHINESE Format Date : "+sdf.format(today));
System.out.println("CANADA_FRENCH Format Date : "+sdf1.format(today));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Из примера ясно, что мы используем метод parse(String str) для преобразования строки в объект Даты.
Для преобразования Даты в строку мы используем формат(Дата дата) метод. Обратите внимание, что реализация обоих этих методов предусмотрена в DateFormat классе и SimpleDateFormat наследует их через наследование java .
Класс DateFormat также поддерживает преобразования, зависящие от часового пояса и локали. Вот почему вы увидите, что выходные данные вышеупомянутой программы зависят от информации о локали, предоставленной во время создания экземпляра SimpleDateFormat.
Символы формата DateFormat
Как и регулярное выражение java , мы должны использовать определенные символы для создания шаблона, который будет использоваться классом формата даты. Вот список всех важных персонажей, которых мы должны знать:
| G | н. э., Британская Колумбия | Обозначение Эпохи |
| y | 2012, 12 | Год |
| M | Август, 08 | Месяц в году |
| w | 27, 52 | Неделя в году |
| W | 2, 4 | неделя в месяце |
| d | 12, 31 | День в месяце |
| D | 365, 123 | День в году |
| u | 1, 7 | День номер недели, |
| a | УТРА, ВЕЧЕРА | Маркер AM/PM |
| H | 23 | час в день (0-23) |
| k | 22 | час в день (1-24) |
| K | 10 | час в AM/PM (0-11) |
| m | 23 | минута в час (0-59) |
| s | 43 | Секунды в минуту (0-59) |
| S | 567 | миллисекунды (0-999) |
| z | PST, CST, GMT | Общий часовой пояс |
| Z | -0800 | Часовой пояс RFC 822 |
| X | -08, -08:00 | Часовой пояс ISO 8601 |
Строка Формата Даты Java
Давайте немного расширим нашу программу, чтобы поддерживать несколько форматов строк при анализе на сегодняшний день. Эта ситуация может возникнуть, если у вас есть веб-страница или поле XML, которое поддерживает несколько форматов для передачи даты в виде строки.
package com.journaldev.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class StringToDateUtil {
private List sdfList;
// set the List of Format's you want to use
public StringToDateUtil(List sdfList) throws Exception {
if (sdfList == null)
throw new Exception("sdfList can't be null");
this.sdfList = sdfList;
}
public Date stringToDate(String str) throws Exception {
if (str == null)
return null;
Date date = null;
// parse the input String with list of SimpleDateFormats we have
for (SimpleDateFormat sdf : sdfList) {
try {
date = sdf.parse(str);
} catch (ParseException pe) {
// do nothing, we need to try other format
}
// check if parsed successfully?
if (date != null)
break;
}
// return date if parsed successfully or else throw exception
if (date != null)
return date;
throw new Exception("invalid format for String:" + str);
}
public static void main(String args[]) throws Exception {
List formatList = new ArrayList<>();
formatList.add(new SimpleDateFormat("dd MMM yyyy"));
formatList.add(new SimpleDateFormat("M/dd/yyyy"));
formatList.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss a"));
StringToDateUtil sdUtil = new StringToDateUtil(formatList);
// Lets format some String to Date
String[] arr = { "10 NOV 2012", "10/14/2012", "10/14/2012 10:45:30", "ABC", null };
for (String str : arr) {
try {
System.out.println(str + " Date Object = " + sdUtil.stringToDate(str));
} catch (Exception e) {
System.out.println(str + " is not a valid date");
}
}
}
}
В приведенном выше классе мы передаем все строки формата даты, которые мы ожидаем, а затем stringToDate(String str) метод использует их для анализа данной строки.
Вот результат работы вышеприведенной программы.
10 NOV 2012 Date Object = Sat Nov 10 00:00:00 IST 2012 10/14/2012 Date Object = Sun Oct 14 00:00:00 IST 2012 10/14/2012 10:45:30 Date Object = Sun Oct 14 00:00:00 IST 2012 ABC is not a valid date null Date Object = null
Обратите внимание, что вы должны создать статический объект для списка форматов в своем приложении, а не инициализировать его все время.
Возможно, вы также захотите создать одноэлементный класс для этой цели.
Класс DateFormat не является потокобезопасным. Поэтому, если вы хотите обеспечить потокобезопасность, вам необходимо создать класс-оболочку для SimpleDateFormat и реализовать методы синхронизированного формата и анализа, которые внутренне вызывают методы DateFormat.
Обновление : Java 8 новый API даты и времени обеспечивает простой и стандартный подход к обработке синтаксического анализа и форматирования даты, вы должны проверить это в Java 8 Дата учебник.