aboutsummaryrefslogblamecommitdiff
path: root/app/src/main/java/com/camilstaps/common/Date.java
blob: 8e5d6f436c1d45da6c1b57f6ca96da76f983bbb3 (plain) (tree)
1
2
3
4
5
6
7
8
9
                              
                               
                        
                              
                                
                                  
                          
                                   























































                                                              


                                      








                                     








                                       








                                       








                                     






                                          















































































                                                                                                    
                                                 

                                                                                                                                     
     
package com.camilstaps.common;

import android.content.Context;
import android.util.Log;

import com.camilstaps.taize.R;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by camilstaps on 7-4-15.
 */
public class Date implements Comparable<Date> {

    private int year, month, day;

    public Date() {
        Calendar cal = Calendar.getInstance();
        year = cal.get(Calendar.YEAR);
        month = cal.get(Calendar.MONTH) + 1;
        day = cal.get(Calendar.DAY_OF_MONTH);
    }

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Date(String format) throws ParseException {
        Pattern pat = Pattern.compile("(\\d*)-(\\d*)-(\\d*)");
        Matcher match = pat.matcher(format);
        if (match.find()) {
            year = Integer.parseInt(match.group(1));
            month = Integer.parseInt(match.group(2));
            day = Integer.parseInt(match.group(3));
        } else {
            throw new ParseException("Wrong date format", 0);
        }
    }

    public Date(Date copy) {
        year = copy.year;
        month = copy.month;
        day = copy.day;
    }

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public void addYears(int n) {
        year += n;
    }

    public void subtractYears(int n) {
        year -= n;
    }

    public void addMonths(int n) {
        for (int i = 0; i < n; i++) {
            month++;
            if (month >= 13) {
                month = 1;
                addYears(1);
            }
        }
    }

    public void subtractMonths(int n) {
        for (int i = 0; i < n; i++) {
            month--;
            if (month <= 0) {
                month = 12;
                subtractYears(1);
            }
        }
    }

    public void addDays(int n) {
        for (int i = 0; i < n; i++) {
            day++;
            if (day >= daysOfMonth()) {
                day = 1;
                addMonths(1);
            }
        }
    }

    public void subtractDays(int n) {
        for (int i = 0; i < n; i++) {
            day--;
            if (day <= 0) {
                month--;
                day = daysOfMonth();
            }
        }
    }

    public void addOrSubtractDays(int n) {
        if (n < 0) {
            subtractDays(-n);
        } else {
            addDays(n);
        }
    }

    public boolean equals(Date date) {
        return year == date.year && month == date.month && day == date.day;
    }

    @Override
    public String toString() {
        return Integer.toString(year) + "-" + Integer.toString(month) + "-" + Integer.toString(day);
    }

    public static boolean isLeapYear(int year) {
        if (year % 4 != 0)
            return false;
        if (year % 100 != 0)
            return true;
        if (year % 400 != 0)
            return false;
        return true;
    }

    public boolean isLeapYear() {
        return isLeapYear(year);
    }

    public static int daysOfYear(int year) {
        return isLeapYear(year) ? 366 : 365;
    }

    public int daysOfYear() {
        return daysOfYear(year);
    }

    public static int daysOfMonth(int year, int month) {
        switch (month) {
            case 2: return isLeapYear(year) ? 29 : 28;
            case 1:
            case 3:
            case 5:
            case 8:
            case 10:
            case 12:
                return 31;
            default:
                return 30;
        }
    }

    public int daysOfMonth() {
        return daysOfMonth(year, month);
    }

    public int diffDays(Date withDate) {
        Date smaller, bigger;
        if (compareTo(withDate) > 0) {
            smaller = new Date(this);
            bigger = new Date(withDate);
        } else {
            smaller = new Date(withDate);
            bigger = new Date(this);
        }
        if (smaller.equals(bigger)) {
            return 0;
        }
        int i = 0;
        while (!smaller.equals(bigger)) {
            smaller.addDays(1);
            i++;
        }
        return i;
    }

    @Override
    public int compareTo(Date another) {
        if (another.year != year)
            return Integer.compare(another.year, year);
        if (another.month != month)
            return Integer.compare(another.month, month);
        if (another.day != day)
            return Integer.compare(another.day, day);
        return 0;
    }

    public String toNiceString(Context context) {
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE d MMMM y");
        return sdf.format(new GregorianCalendar(year, month - 1, day).getTime());
        //return android.text.format.DateFormat.getDateFormat(context).format(new GregorianCalendar(year, month - 1, day).getTime());
    }
}