📄 timeutil.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.util;
import java.sql.*;
import java.util.*;
/**
* Time Utilities
*
* @author Jorg Janke
* @version $Id: TimeUtil.java,v 1.18 2006/01/19 01:51:26 jjanke Exp $
*/
public class TimeUtil
{
/**
* Get earliest time of a day (truncate)
* @param time day and time
* @return day with 00:00
*/
static public Timestamp getDay (long time)
{
if (time == 0)
time = System.currentTimeMillis();
GregorianCalendar cal = new GregorianCalendar(Language.getLoginLanguage().getLocale());
cal.setTimeInMillis(time);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Timestamp (cal.getTimeInMillis());
} // getDay
/**
* Get earliest time of a day (truncate)
* @param dayTime day and time
* @return day with 00:00
*/
static public Timestamp getDay (Timestamp dayTime)
{
if (dayTime == null)
return getDay(System.currentTimeMillis());
return getDay(dayTime.getTime());
} // getDay
/**
* Get earliest time of a day (truncate)
* @param day day 1..31
* @param month month 1..12
* @param year year (if two diguts: < 50 is 2000; > 50 is 1900)
* @return timestamp ** not too reliable
*/
static public Timestamp getDay (int year, int month, int day)
{
if (year < 50)
year += 2000;
else if (year < 100)
year += 1900;
if (month < 1 || month > 12)
throw new IllegalArgumentException("Invalid Month: " + month);
if (day < 1 || day > 31)
throw new IllegalArgumentException("Invalid Day: " + month);
GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
return new Timestamp (cal.getTimeInMillis());
} // getDay
/**
* Get today (truncate)
* @return day with 00:00
*/
static public Calendar getToday ()
{
GregorianCalendar cal = new GregorianCalendar(Language.getLoginLanguage().getLocale());
// cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal;
} // getToday
/**
* Get earliest time of next day
* @param day day
* @return next day with 00:00
*/
static public Timestamp getNextDay (Timestamp day)
{
if (day == null)
day = new Timestamp(System.currentTimeMillis());
GregorianCalendar cal = new GregorianCalendar(Language.getLoginLanguage().getLocale());
cal.setTimeInMillis(day.getTime());
cal.add(Calendar.DAY_OF_YEAR, +1); // next
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Timestamp (cal.getTimeInMillis());
} // getNextDay
/**
* Get last date in month
* @param day day
* @return last day with 00:00
*/
static public Timestamp getMonthLastDay (Timestamp day)
{
if (day == null)
day = new Timestamp(System.currentTimeMillis());
GregorianCalendar cal = new GregorianCalendar(Language.getLoginLanguage().getLocale());
cal.setTimeInMillis(day.getTime());
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
//
cal.add(Calendar.MONTH, 1); // next
cal.set(Calendar.DAY_OF_MONTH, 1); // first
cal.add(Calendar.DAY_OF_YEAR, -1); // previous
return new Timestamp (cal.getTimeInMillis());
} // getNextDay
/**
* Return the day and time
* @param day day part
* @param time time part
* @return day + time
*/
static public Timestamp getDayTime (Timestamp day, Timestamp time)
{
GregorianCalendar cal_1 = new GregorianCalendar();
cal_1.setTimeInMillis(day.getTime());
GregorianCalendar cal_2 = new GregorianCalendar();
cal_2.setTimeInMillis(time.getTime());
//
GregorianCalendar cal = new GregorianCalendar(Language.getLoginLanguage().getLocale());
cal.set(cal_1.get(Calendar.YEAR),
cal_1.get(Calendar.MONTH),
cal_1.get(Calendar.DAY_OF_MONTH),
cal_2.get(Calendar.HOUR_OF_DAY),
cal_2.get(Calendar.MINUTE),
cal_2.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, 0);
Timestamp retValue = new Timestamp(cal.getTimeInMillis());
// log.fine( "TimeUtil.getDayTime", "Day=" + day + ", Time=" + time + " => " + retValue);
return retValue;
} // getDayTime
/**
* Is the _1 in the Range of _2
* <pre>
* Time_1 +--x--+
* Time_2 +a+ +---b---+ +c+
* </pre>
* The function returns true for b and false for a/b.
* @param start_1 start (1)
* @param end_1 not included end (1)
* @param start_2 start (2)
* @param end_2 not included (2)
* @return true if in range
*/
static public boolean inRange (Timestamp start_1, Timestamp end_1, Timestamp start_2, Timestamp end_2)
{
// validity check
if (end_1.before(start_1))
throw new UnsupportedOperationException ("TimeUtil.inRange End_1=" + end_1 + " before Start_1=" + start_1);
if (end_2.before(start_2))
throw new UnsupportedOperationException ("TimeUtil.inRange End_2=" + end_2 + " before Start_2=" + start_2);
// case a
if (!end_2.after(start_1)) // end not including
{
// log.fine( "TimeUtil.InRange - No", start_1 + "->" + end_1 + " <??> " + start_2 + "->" + end_2);
return false;
}
// case c
if (!start_2.before(end_1)) // end not including
{
// log.fine( "TimeUtil.InRange - No", start_1 + "->" + end_1 + " <??> " + start_2 + "->" + end_2);
return false;
}
// log.fine( "TimeUtil.InRange - Yes", start_1 + "->" + end_1 + " <??> " + start_2 + "->" + end_2);
return true;
} // inRange
/**
* Is start..end on one of the days ?
* @param start start day
* @param end end day (not including)
* @param OnMonday true if OK
* @param OnTuesday true if OK
* @param OnWednesday true if OK
* @param OnThursday true if OK
* @param OnFriday true if OK
* @param OnSaturday true if OK
* @param OnSunday true if OK
* @return true if on one of the days
*/
static public boolean inRange (Timestamp start, Timestamp end,
boolean OnMonday, boolean OnTuesday, boolean OnWednesday,
boolean OnThursday, boolean OnFriday, boolean OnSaturday, boolean OnSunday)
{
// are there restrictions?
if (OnSaturday && OnSunday && OnMonday && OnTuesday && OnWednesday && OnThursday && OnFriday)
return false;
GregorianCalendar calStart = new GregorianCalendar();
calStart.setTimeInMillis(start.getTime());
int dayStart = calStart.get(Calendar.DAY_OF_WEEK);
//
GregorianCalendar calEnd = new GregorianCalendar();
calEnd.setTimeInMillis(end.getTime());
calEnd.add(Calendar.DAY_OF_YEAR, -1); // not including
int dayEnd = calEnd.get(Calendar.DAY_OF_WEEK);
// On same day
if (calStart.get(Calendar.YEAR) == calEnd.get(Calendar.YEAR)
&& calStart.get(Calendar.MONTH) == calEnd.get(Calendar.MONTH)
&& calStart.get(Calendar.DAY_OF_MONTH) == calEnd.get(Calendar.DAY_OF_YEAR))
{
if ((!OnSaturday && dayStart == Calendar.SATURDAY)
|| (!OnSunday && dayStart == Calendar.SUNDAY)
|| (!OnMonday && dayStart == Calendar.MONDAY)
|| (!OnTuesday && dayStart == Calendar.TUESDAY)
|| (!OnWednesday && dayStart == Calendar.WEDNESDAY)
|| (!OnThursday && dayStart == Calendar.THURSDAY)
|| (!OnFriday && dayStart == Calendar.FRIDAY))
{
// log.fine( "TimeUtil.InRange - SameDay - Yes", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return true;
}
// log.fine( "TimeUtil.InRange - SameDay - No", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return false;
}
//
// log.fine( "TimeUtil.inRange - WeekDay Start=" + dayStart + ", Incl.End=" + dayEnd);
// Calendar.SUNDAY=1 ... SATURDAY=7
BitSet days = new BitSet (8);
// Set covered days in BitArray
if (dayEnd <= dayStart)
dayEnd += 7;
for (int i = dayStart; i < dayEnd; i++)
{
int index = i;
if (index > 7)
index -= 7;
days.set(index);
// System.out.println("Set index=" + index + " i=" + i);
}
// for (int i = Calendar.SUNDAY; i <= Calendar.SATURDAY; i++)
// System.out.println("Result i=" + i + " - " + days.get(i));
// Compare days to availability
if ((!OnSaturday && days.get(Calendar.SATURDAY))
|| (!OnSunday && days.get(Calendar.SUNDAY))
|| (!OnMonday && days.get(Calendar.MONDAY))
|| (!OnTuesday && days.get(Calendar.TUESDAY))
|| (!OnWednesday && days.get(Calendar.WEDNESDAY))
|| (!OnThursday && days.get(Calendar.THURSDAY))
|| (!OnFriday && days.get(Calendar.FRIDAY)))
{
// log.fine( "MAssignment.InRange - Yes", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return true;
}
// log.fine( "MAssignment.InRange - No", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return false;
} // isRange
/**
* Is it the same day
* @param one day
* @param two compared day
* @return true if the same day
*/
static public boolean isSameDay (Timestamp one, Timestamp two)
{
GregorianCalendar calOne = new GregorianCalendar();
if (one != null)
calOne.setTimeInMillis(one.getTime());
GregorianCalendar calTwo = new GregorianCalendar();
if (two != null)
calTwo.setTimeInMillis(two.getTime());
if (calOne.get(Calendar.YEAR) == calTwo.get(Calendar.YEAR)
&& calOne.get(Calendar.MONTH) == calTwo.get(Calendar.MONTH)
&& calOne.get(Calendar.DAY_OF_MONTH) == calTwo.get(Calendar.DAY_OF_YEAR))
return true;
return false;
} // isSameDay
/**
* Is it the same hour
* @param one day/time
* @param two compared day/time
* @return true if the same day
*/
static public boolean isSameHour (Timestamp one, Timestamp two)
{
GregorianCalendar calOne = new GregorianCalendar();
if (one != null)
calOne.setTimeInMillis(one.getTime());
GregorianCalendar calTwo = new GregorianCalendar();
if (two != null)
calTwo.setTimeInMillis(two.getTime());
if (calOne.get(Calendar.YEAR) == calTwo.get(Calendar.YEAR)
&& calOne.get(Calendar.MONTH) == calTwo.get(Calendar.MONTH)
&& calOne.get(Calendar.DAY_OF_MONTH) == calTwo.get(Calendar.DAY_OF_YEAR)
&& calOne.get(Calendar.HOUR_OF_DAY) == calTwo.get(Calendar.HOUR_OF_DAY))
return true;
return false;
} // isSameHour
/**
* Is all day
* @param start start date
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -