DateHelper.java

package com.tradecloud.domain.helper;

import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.util.List;

public class DateHelper extends XmlAdapter<String, LocalDate> {

    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd");
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm");
    public static final DateTimeFormatter PERIOD_FORMATTER = DateTimeFormat.forPattern("yyyy-MM");
    public static final DateTimeFormatter MONTH_NAME_PERIOD_FORMATTER = DateTimeFormat.forPattern("MMMM yyyy");
    public static final DateTimeFormatter MONTH_DAY_FORMATTER = DateTimeFormat.forPattern("MM-dd");

    public static LocalDate parseDate(String jodaDateAsString) {
        return DATE_FORMATTER.parseDateTime(jodaDateAsString).toLocalDate();
    }

    public static String parseDate(LocalDate date) {
        return date.toString(DATE_FORMATTER);
    }

    public static String getNullSafeFormattedDate(LocalDate date, DateTimeFormatter formatter) {
        StringBuilder builder = new StringBuilder();
        builder.append((date == null) ? "" : date.toString(formatter));
        return builder.toString();
    }

    public static LocalDate extractLocalDateOrNull(String dateString) {
        if (!StringUtils.isBlank(dateString)) {
            return parseDate(dateString);
        }
        return null;
    }

    public static LocalDateTime parseDateTime(String jodaDateAsString) {
        if (jodaDateAsString.length() == 10) {
            return DATE_FORMATTER.parseDateTime(jodaDateAsString).toLocalDateTime();
        }
        return DATE_TIME_FORMATTER.parseDateTime(jodaDateAsString).toLocalDateTime();
    }

    public static LocalDateTime extractLocalDateTimeOrNull(String dateTimeString) {
        if (!StringUtils.isBlank(dateTimeString)) {
            return parseDateTime(dateTimeString);
        }
        return null;
    }

    public static LocalDate latestDate(List<LocalDate> dates) {
        LocalDate latestDate = dates.get(0);
        for (LocalDate date : dates) {
            if (date.isAfter(latestDate)) {
                latestDate = date;
            }
        }
        return latestDate;
    }

    @Override
    public LocalDate unmarshal(String v) throws Exception {
        return parseDate(v);
    }

    @Override
    public String marshal(LocalDate v) throws Exception {
        return parseDate(v);
    }
}