📄 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 Business Solution
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
* Portions created by Jorg Janke are Copyright (C) 1999-2002 Jorg Janke, parts
* created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.util;
import java.util.*;
import java.sql.*;
import java.math.*;
import org.compiere.model.*;
/**
* Time Utilities
*
* @author Jorg Janke
* @version $Id: TimeUtil.java,v 1.8 2003/02/11 06:22:10 jjanke Exp $
*/
public class TimeUtil
{
/**
* Calculate End Date based on start date and qty
* @param ctx context
* @param startDate date
* @param C_UOM_ID UOM
* @param qty qty
* @return end date
*/
static public Timestamp getEndDate (Properties ctx, Timestamp startDate, int C_UOM_ID, BigDecimal qty)
{
GregorianCalendar endDate = new GregorianCalendar();
endDate.setTime(startDate);
//
int minutes = UOMConversion.convertToMinutes (ctx, C_UOM_ID, qty);
endDate.add(Calendar.MINUTE, minutes);
//
Timestamp retValue = new Timestamp(endDate.getTimeInMillis());
// Log.trace(Log.l4_Data, "TimeUtil.getEndDate", "Start=" + startDate
// + ", Qty=" + qty + ", End=" + retValue);
return retValue;
} // startDate
/**
* 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)
return null;
GregorianCalendar cal = new GregorianCalendar(Language.getLanguage().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 null;
return getDay(dayTime.getTime());
} // getDay
/**
* Get earliest time of next day
* @param day day
* @return next day with 00:00
*/
static public Timestamp getNextDay (Timestamp day)
{
if (day == null)
return null;
GregorianCalendar cal = new GregorianCalendar(Language.getLanguage().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
/**
* 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.getLanguage().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.trace(Log.l6_Database, "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.trace(Log.l6_Database, "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.trace(Log.l6_Database, "TimeUtil.InRange - No", start_1 + "->" + end_1 + " <??> " + start_2 + "->" + end_2);
return false;
}
// Log.trace(Log.l6_Database, "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.trace(Log.l6_Database, "TimeUtil.InRange - SameDay - Yes", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return true;
}
// Log.trace(Log.l6_Database, "TimeUtil.InRange - SameDay - No", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return false;
}
//
// Log.trace(Log.l6_Database, "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.trace(Log.l6_Database, "MAssignment.InRange - Yes", start + "->" + end + " - "
// + OnMonday+"-"+OnTuesday+"-"+OnWednesday+"-"+OnThursday+"-"+OnFriday+"="+OnSaturday+"-"+OnSunday);
return true;
}
// Log.trace(Log.l6_Database, "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();
calOne.setTimeInMillis(one.getTime());
GregorianCalendar calTwo = new GregorianCalendar();
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 all day
* @param start start date
* @param end end date
* @return true if all day (00:00-00:00 next day)
*/
static public boolean isAllDay (Timestamp start, Timestamp end)
{
GregorianCalendar calStart = new GregorianCalendar();
calStart.setTimeInMillis(start.getTime());
GregorianCalendar calEnd = new GregorianCalendar();
calEnd.setTimeInMillis(end.getTime());
if (calStart.get(Calendar.HOUR_OF_DAY) == calEnd.get(Calendar.HOUR_OF_DAY)
&& calStart.get(Calendar.MINUTE) == calEnd.get(Calendar.MINUTE)
&& calStart.get(Calendar.SECOND) == calEnd.get(Calendar.SECOND)
&& calStart.get(Calendar.MILLISECOND) == calEnd.get(Calendar.MILLISECOND)
&& calStart.get(Calendar.HOUR_OF_DAY) == 0
&& calStart.get(Calendar.MINUTE) == 0
&& calStart.get(Calendar.SECOND) == 0
&& calStart.get(Calendar.MILLISECOND) == 0
&& start.before(end))
return true;
//
return false;
} // isAllDay
/**
* Calculate the number of days between start and end.
* @param start start date
* @param end end date
* @return number of days (0 = same)
*/
static public int getDaysBetween (Timestamp start, Timestamp end)
{
boolean negative = false;
if (end.before(start))
{
negative = true;
Timestamp temp = start;
start = end;
end = temp;
}
//
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(start);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
GregorianCalendar calEnd = new GregorianCalendar();
calEnd.setTime(end);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
// System.out.println("Start=" + start + ", End=" + end + ", dayStart=" + cal.get(Calendar.DAY_OF_YEAR) + ", dayEnd=" + calEnd.get(Calendar.DAY_OF_YEAR));
// in same year
if (cal.get(Calendar.YEAR) == calEnd.get(Calendar.YEAR))
{
if (negative)
return (calEnd.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_YEAR)) * -1;
return calEnd.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_YEAR);
}
// not very efficient, but correct
int counter = 0;
while (calEnd.after(cal))
{
cal.add (Calendar.DAY_OF_YEAR, 1);
counter++;
}
if (negative)
return counter * -1;
return counter;
} // getDatesBetrween
/**
* Return Day + offset (truncates)
* @param day Day
* @param offset day offset
* @return Day + offset at 00:00
*/
static public Timestamp addDays (Timestamp day, int offset)
{
if (day == null)
return null;
//
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
if (offset == 0)
return new Timestamp (cal.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, offset); // may have a problem with negative (before 1/1)
return new Timestamp (cal.getTimeInMillis());
} // addDays
/**
* Return DateTime + offset in minutes
* @param dateTime Date and Time
* @param offset minute offset
* @return dateTime + offset in minutes
*/
static public Timestamp addMinutess (Timestamp dateTime, int offset)
{
if (dateTime == null)
return null;
if (offset == 0)
return dateTime;
//
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dateTime);
cal.add(Calendar.MINUTE, offset); // may have a problem with negative
return new Timestamp (cal.getTimeInMillis());
} // addMinutes
} // TimeUtil
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -