tl; д-р
LocalDate.of( 2014 , 2 , 11 )
Якщо ви наполягаєте на використанні жахливого старого java.util.Dateкласу, перейдіть із сучасних класів java.time .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Деталі
Якщо ви хочете "легко", вам слід використовувати новий пакет java.time у Java 8, а не горезвісний клопіт java.util.Date & .Calendar, що входять до складу Java.
java.time
Java.time структура , вбудована в Java 8 , а потім витісняє клопітно старі класи java.util.Date/.Calendar.
Лише дата

LocalDateКлас пропонується java.time для представлення дати тільки значення без якого - або часу в день або часового поясу. Вам потрібен часовий пояс, щоб визначити дату, оскільки новий день світає раніше в Парижі, ніж, наприклад, у Монреалі. ZoneIdКлас часових поясів.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Дамп до консолі:
System.out.println ( "today: " + today + " in zone: " + zoneId );
сьогодні: 26.11.2015 в зоні: Азія / Сінгапур
Або використовуйте заводський метод, щоб вказати рік, місяць, день.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 11.02.2014
Або передайте місяць номер 1-12, а не DayOfWeekоб’єкт перерахування.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Часовий пояс

A LocalDateне має реального значення, поки ви не налаштуєте його на часовий пояс. У java.time ми застосовуємо часовий пояс для генерації ZonedDateTimeоб’єкта. Це також означає час доби, але який час? Зазвичай має сенс піти з першого моменту дня. Можна подумати, що це означає час 00:00:00.000, але не завжди правдивий через перехід на літній час (DST) та, можливо, інші аномалії. Замість того, щоб припустити цей час, ми просимо java.time визначити перший момент дня, зателефонувавши atStartOfDay.
Вкажіть правильний час ім'я зони в форматі continent/region, наприклад America/Montreal, Africa/Casablancaабо Pacific/Auckland. Ніколи не використовуйте абревіатури з 3-4 букв, такі як ESTабо, ISTоскільки вони не є справжніми часовими поясами, не стандартизовані і навіть не унікальні (!).
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Азія / Сінгапур]
UTC

Для внутрішньої роботи (бізнес-логіка, база даних, зберігання та обмін даними) ми зазвичай використовуємо часовий пояс UTC . У java.time Instantклас представляє момент на часовій шкалі в UTC. Миттєвий об’єкт можна отримати з ZonedDateTime за допомогою виклику toInstant.
Instant instant = zdt.toInstant();
миттєвий: 2014-02-10T16: 00: 00Z
Перетворити
Вам слід уникати використання java.util.Dateкласу повністю. Але якщо вам потрібно взаємодіяти зі старим кодом, який ще не оновлений для java.time , ви можете конвертувати назад і назад. Перегляньте нові методи перетворення, додані до старих класів.
java.util.Date d = java.util.from( instant ) ;
... і ...
Instant instant = d.toInstant() ;

Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .
Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .
Ви можете обмінювати об'єкти java.time безпосередньо з базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або новішою. Не потрібні рядки, не потрібні java.sql.*класи. Hibernate 5 та JPA 2.2 підтримують java.time .
Де отримати класи java.time?
ОНОВЛЕННЯ: Бібліотека Joda-Time тепер перебуває в режимі обслуговування та радить перехід на класи java.time . Я залишаю цей розділ на місці історії.
Joda-Time
З одного боку, Joda-Time використовує розумну нумерацію, тому лютий - 2ні 1. Інша справа, Joda-Time DateTime справді знає призначений часовий пояс, на відміну від java.util.Date, який, схоже, має часовий пояс, але цього не робить.
І не забувайте про часовий пояс. Інакше ви отримаєте JVM за замовчуванням.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Дамп на консоль…
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
При запуску ...
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Перетворення
Якщо вам потрібно перетворити на java.util.Date для використання з іншими класами ...
java.util.Date date = dateTimeSingapore.toDate();