/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package utils;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
*
* @author antony
*/
public class DateTimeUtils {
/**
* принадлежит текущему дню
* @param d
* @return
*/
public static boolean belongsToCurrentDay(Date d) {
Calendar cd = GregorianCalendar.getInstance();
cd.setTime(d);
Calendar cc = GregorianCalendar.getInstance();
cc.setTimeInMillis(System.currentTimeMillis());
return cd.get(Calendar.YEAR) == cc.get(Calendar.YEAR)
&& cd.get(Calendar.DAY_OF_YEAR) == cc.get(Calendar.DAY_OF_YEAR);
}
/**
* Вычисляет количество дней между различными датами. Mежду двумя соседними
* днями принимается разница 1 день (смена летнего. зимнего времени учтена)
* @param begin
* @param end
* @return
*/
public static long daysBetween(Date begin, Date end) {
double diff = getDateOnly(end).getTime() - getDateOnly(begin).getTime();
return Math.round(diff/(1000*3600*24));
}
/**
* Вычисляет количество дней между различными датами. Mежду двумя соседними
* днями принимается разница 1 день (смена летнего. зимнего времени учтена)
* @param begin
* @param end
* @return
*/
public static long daysBetween(Calendar begin, Calendar end) {
return daysBetween(begin.getTime(), end.getTime());
}
/**
* Приводит дату и время к только дате (зануляет часы минуты секунды и миллисекунды)
* @param date
* @return
*/
public static Date getDateOnly(Date date) {
if (date == null) {
return null;
}
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
gc.setTime(date);
gc = new GregorianCalendar(gc.get(GregorianCalendar.YEAR), gc.get(GregorianCalendar.MONTH), gc.get(GregorianCalendar.DAY_OF_MONTH));
return gc.getTime();
}
/**
* Приводит дату и время к только дате (зануляет часы минуты секунды и миллисекунды)
* @param date
* @return
*/
public static Calendar getDateOnly(Calendar cal) {
if (cal == null) {
return null;
}
return new GregorianCalendar(cal.get(GregorianCalendar.YEAR), cal.get(GregorianCalendar.MONTH), cal.get(GregorianCalendar.DAY_OF_MONTH));
}
public static Date getNextDay(Date date) {
if (date == null) {
return null;
}
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
gc.setTime(date);
gc.add(GregorianCalendar.DAY_OF_MONTH, 1);
return gc.getTime();
}
public static Date getDateOnly() {
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
gc = new GregorianCalendar(gc.get(GregorianCalendar.YEAR), gc.get(GregorianCalendar.MONTH), gc.get(GregorianCalendar.DAY_OF_MONTH));
return gc.getTime();
}
/**
* Вернёт число полных лет
* @param from
* @param to
* @return
*/
public static int calcAge(Date from, Date to){
if (from == null || to == null) {
return Integer.MIN_VALUE;
}
GregorianCalendar calendarFrom = new GregorianCalendar();
calendarFrom.setTime(from);
GregorianCalendar calendarTo = new GregorianCalendar();
calendarTo.setTime(to);
boolean negative = calendarTo.before(calendarFrom);
int yearDif = calendarTo.get(GregorianCalendar.YEAR) - calendarFrom.get(GregorianCalendar.YEAR);
calendarTo.set(GregorianCalendar.YEAR, calendarFrom.get(GregorianCalendar.YEAR));
if (calendarTo.before(calendarFrom)) {
if (!negative) {
yearDif -= 1;
}
}
else{
if (negative) {
yearDif += 1;
}
}
return yearDif;
}
public static class AgeInMonth{
int month;
int days;
}
public static AgeInMonth calcAgeInMonth(Date from, Date to){
if (from == null || to == null) {
return null;
}
GregorianCalendar calendarFrom = new GregorianCalendar();
calendarFrom.setTime(from);
GregorianCalendar calendarTo = new GregorianCalendar();
calendarTo.setTime(to);
boolean negative = calendarTo.before(calendarFrom);
int yearBase = calendarTo.get(GregorianCalendar.YEAR) - calendarFrom.get(GregorianCalendar.YEAR);
int monthDiff = calendarTo.get(GregorianCalendar.MONTH) - calendarFrom.get(GregorianCalendar.MONTH);
monthDiff += yearBase * 12;
calendarFrom.set(GregorianCalendar.YEAR, calendarFrom.get(GregorianCalendar.YEAR));
calendarFrom.set(GregorianCalendar.MONTH, calendarFrom.get(GregorianCalendar.MONTH));
/*if (){
}*/
int dayDiff = calendarTo.get(GregorianCalendar.MONTH) - calendarFrom.get(GregorianCalendar.MONTH);
return null;
}
private static String[] DAY_NAMES = {
"первое",
"второе",
"третье",
"четвертое",
"пятое",
"шестое",
"седьмое",
"восьмое",
"девятое",
"десятое",
"одиннадцатое",
"двенадцатое",
"тринадцатое",
"четырнадцатое",
"пятнадцатое",
"шестнадцатое",
"семнадцатое",
"восемнадцатое",
"девятнадцатое",
"двадцатое",
};
private static String DAY_TWENTY_PLUS = "двадцать ";
private static String DAY_THIRTY = "тридцатое";
private static String DAY_THIRTY_PLUS = "тридцать ";
/**
* приопразует день месяца в строку прописю, нужно для преобразования даты в строку прописью
* @param day день месяца (от 1 до 31)
* @return
*/
static public String dayOfMonthToString(int day){
if (day < 1 || day > 31){
throw new IllegalArgumentException("is no day of month");
}
// в данном случае числа понятнее именованых констант
if (day <= 20){
return DAY_NAMES[day - 1];
}
if (day < 30){
return DAY_TWENTY_PLUS + DAY_NAMES[day - 20 - 1];
}
if (day == 30){
return DAY_THIRTY;
}
return DAY_THIRTY_PLUS + DAY_NAMES[day - 30 - 1];
}
static public String dayOfMonthToString(Date time){
GregorianCalendar col = new GregorianCalendar();
col.setTime(time);
return dayOfMonthToString(col.get(GregorianCalendar.DAY_OF_MONTH));
}
static public String[] MONTH_NAMES = new String[]{
"января",
"февраля",
"марта",
"апреля",
"мая",
"июня",
"июля",
"августа",
"сентября",
"октября",
"ноября",
"декабря",
};
static public String monthToString(int month){
if (month < 0 || month > 11){
throw new IllegalArgumentException("Incorrect month");
}
return MONTH_NAMES[month];
}
static public String monthToString(Date time){
GregorianCalendar col = new GregorianCalendar();
col.setTime(time);
return monthToString(col.get(GregorianCalendar.MONTH));
}
static public boolean dateValid(int year, int month, int dayOfMonth) {
if (year < 1800) {
return false;
}
GregorianCalendar cal = new GregorianCalendar(year, month, dayOfMonth);
if (cal.get(Calendar.YEAR) != year) {
return false;
}
if (cal.get(Calendar.MONTH) != month) {
return false;
}
if (cal.get(Calendar.DAY_OF_MONTH) != dayOfMonth) {
return false;
}
return true;
}
}