joda-time-android

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());

Это только часть примеров, взятых из документации. На самом деле возможностей у библиотеки больше. Очень легко добавлять промежутки времени к заданной дате, устанавливать интервалы, продолжительность и периоды.