Java-разработчики считают, что классы для работы с датами и временем в Java очень неудобны. Очень большую популярность у программистов получила Java-библиотека Joda-Time. Описываемая здесь библиотека была специально адаптирована под Android. Статья была написана несколько лет назад и по моему мнению морально устарела. Поэтому текст статьи был перенесён на другой сайт для истории.
В Java 8 был добавлен новый класс, который позаимствовал многое из популярной библиотеки.
Позже появилась альтернатива - библиотека JakeWharton/ThreeTenABP: An adaptation of the JSR-310 backport for Android., которая по мнению автора библиотеки, эффективнее.
Домашняя страница - https://github.com/dlew/joda-time-android
Подключаем через Gradle:
compile 'net.danlew:android.joda:2.8.1'
Для инициализации библиотеки нужно создать класс-наследник от Application (не забудьте добавить имя в манифесте):
package ru.alexanderklimov.test;
import android.app.Application;
import net.danlew.android.joda.JodaTimeAndroid;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
JodaTimeAndroid.init(this);
}
}
Общий принцип работы с методами библиотеки во многом идентичен с стандартными методами стандартных классов даты и времени. Но есть несколько отличий и дополнительных удобных свойств. Самое главное - в библиотеке порядок месяцев начинается с 1 (январь).
Рассмотрим простые примеры для ознакомления.
Чтобы получить дату Нового года от текущей даты, прибавляем один год (plusYears(1)) и берём первое число этого года (withDayOfYear(1)). Метод библиотеки daysBetween() вычисляет разницу между двумя датами. Комбинация методов позволяет быстро вычислить количество дней до Нового года.
public Days daysToNewYear(LocalDate fromDate) {
LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
return Days.daysBetween(fromDate, newYear);
}
// Код для кнопки
TextView infoTextView = (TextView) findViewById(R.id.textView);
Days days = daysToNewYear(LocalDate.now());
int ny = days.getDays();
infoTextView.setText("До Нового года: " + String.valueOf(ny) + " дней");
Это был частный случай. Общий способ получения количества дней между двумя датами.
LocalDate startDate = LocalDate.now();
LocalDate endDate = LocalDate.parse("2015-07-27");
Days d = Days.daysBetween(startDate, endDate);
int days = d.getDays();
infoTextView.setText("" + days);
У нас есть дата дня рождения, которая должна быть записана в определённом формате. Распарсим дату и получим название месяца в английской локали.
public String getBirthMonthText(LocalDate dateOfBirth) {
return dateOfBirth.monthOfYear().getAsText(Locale.ENGLISH);
}
// Код для кнопки
infoTextView.setText(getBirthMonthText(LocalDate.parse("1996-07-27")));
DateTime dt = new DateTime();
String monthName = dt.monthOfYear().getAsText(); // длинное имя месяца
// Короткое название месяца на французском
String frenchShortName = dt.monthOfYear().getAsShortText(Locale.French);
infoTextView.setText(frenchShortName);
В Android нет готовой константы для русской локали. Но если у вас на телефоне установлен русский язык, то получить имя месяца можно следующим образом.
String rusShortName = dt.monthOfYear().getAsShortText(Locale.getDefault());
Это только часть примеров, взятых из документации. На самом деле возможностей у библиотеки больше. Очень легко добавлять промежутки времени к заданной дате, устанавливать интервалы, продолжительность и периоды.