// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License. Citrix Systems, Inc.
// reserves all rights not expressly granted by the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.utils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import com.cloud.utils.exception.CloudRuntimeException;
public class DateUtil {
public static final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT");
public static final String YYYYMMDD_FORMAT = "yyyyMMddHHmmss";
private static final DateFormat _outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public static Date currentGMTTime() {
// Date object always stores miliseconds offset based on GMT internally
return new Date();
}
// yyyy-MM-ddTHH:mm:ssZxxxx
public static Date parseTZDateString(String str) throws ParseException {
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'Z");
return dfParse.parse(str);
}
public static Date parseDateString(TimeZone tz, String dateString) {
return parseDateString(tz, dateString, "yyyy-MM-dd HH:mm:ss");
}
public static Date parseDateString(TimeZone tz, String dateString, String formatString) {
DateFormat df = new SimpleDateFormat(formatString);
df.setTimeZone(tz);
try {
return df.parse(dateString);
} catch (ParseException e) {
throw new CloudRuntimeException("why why ", e);
}
}
public static String displayDateInTimezone(TimeZone tz, Date time) {
return getDateDisplayString(tz, time, "yyyy-MM-dd HH:mm:ss z");
}
public static String getDateDisplayString(TimeZone tz, Date time) {
return getDateDisplayString(tz, time, "yyyy-MM-dd HH:mm:ss");
}
public static String getDateDisplayString(TimeZone tz, Date time, String formatString) {
DateFormat df = new SimpleDateFormat(formatString);
df.setTimeZone(tz);
return df.format(time);
}
public static String getOutputString(Date date) {
if (date == null) {
return "";
}
String formattedString = null;
synchronized(_outputFormat) {
formattedString = _outputFormat.format(date);
}
return formattedString;
}
public enum IntervalType {
HOURLY,
DAILY,
WEEKLY,
MONTHLY;
boolean equals(String intervalType) {
return super.toString().equalsIgnoreCase(intervalType);
}
public static IntervalType getIntervalType(String intervalTypeStr) {
for (IntervalType intervalType : IntervalType.values()) {
if (intervalType.equals(intervalTypeStr)) {
return intervalType;
}
}
return null;
}
}
public static IntervalType getIntervalType(short type){
if (type < 0 || type >= IntervalType.values().length) {
return null;
}
return IntervalType.values()[type];
}
/**
* Return next run time
* @param intervalType hourly/daily/weekly/monthly
* @param schedule MM[:HH][:DD] format. DD is day of week for weekly and day of month for monthly
* @param timezone The timezone in which the schedule string is specified
* @param startDate if specified, returns next run time after the specified startDate
* @return
*/
public static Date getNextRunTime(IntervalType type, String schedule, String timezone, Date startDate) {
String[] scheduleParts = schedule.split(":"); //MM:HH:DAY
final Calendar scheduleTime = Calendar.getInstance();
scheduleTime.setTimeZone(TimeZone.getTimeZone(timezone));
if(startDate == null){
startDate = new Date();
}
scheduleTime.setTime(startDate);
// Throw an ArrayIndexOutOfBoundsException if schedule is badly formatted.
scheduleTime.setLenient(false);
int minutes = 0;
int hour = 0;
int day = 0;
Date execDate = null;
switch(type){
case HOURLY:
if(scheduleParts.length < 1){
throw new CloudRuntimeException("Incorrect schedule format: "+schedule+ " for interval type:"+type.toString());
}
minutes = Integer.parseInt(scheduleParts[0]);
scheduleTime.set(Calendar.MINUTE, minutes);
scheduleTime.set(Calendar.SECOND, 0);
scheduleTime.set(Calendar.MILLISECOND, 0);
execDate = scheduleTime.getTime();
// XXX: !execDate.after(startDate) is strictly for testing.
// During testing we use a test clock which runs much faster than the real clock
// So startDate and execDate will always be ahead in the future
// and we will never increase the time here
if (execDate.before(new Date()) || !execDate.after(startDate)) {
scheduleTime.add(Calendar.HOUR_OF_DAY, 1);
}
break;
case DAILY:
if(scheduleParts.length < 2){
throw new CloudRuntimeException("Incorrect schedule format: "+schedule+ " for interval type:"+type.toString());
}
minutes = Integer.parseInt(scheduleParts[0]);
hour = Integer.parseInt(scheduleParts[1]);
scheduleTime.set(Calendar.HOUR_OF_DAY, hour);
scheduleTime.set(Calendar.MINUTE, minutes);
scheduleTime.set(Calendar.SECOND, 0);
scheduleTime.set(Calendar.MILLISECOND, 0);
execDate = scheduleTime.getTime();
// XXX: !execDate.after(startDate) is strictly for testing.
// During testing we use a test clock which runs much faster than the real clock
// So startDate and execDate will always be ahead in the future
// and we will never increase the time here
if (execDate.before(new Date()) || !execDate.after(startDate)) {
scheduleTime.add(Calendar.DAY_OF_YEAR, 1);
}
break;
case WEEKLY:
if(scheduleParts.length < 3){
throw new CloudRuntimeException("Incorrect schedule format: "+schedule+ " for interval type:"+type.toString());
}
minutes = Integer.parseInt(scheduleParts[0]);
hour = Integer.parseInt(scheduleParts[1]);
day = Integer.parseInt(scheduleParts[2]);
scheduleTime.set(Calendar.DAY_OF_WEEK, day);
scheduleTime.set(Calendar.HOUR_OF_DAY, hour);
scheduleTime.set(Calendar.MINUTE, minutes);
scheduleTime.set(Calendar.SECOND, 0);
scheduleTime.set(Calendar.MILLISECOND, 0);
execDate = scheduleTime.getTime();
// XXX: !execDate.after(startDate) is strictly for testing.
// During testing we use a test clock which runs much faster than the real clock
// So startDate and execDate will always be ahead in the future
// and we will never increase the time here
if (execDate.before(new Date()) || !execDate.after(startDate)) {
scheduleTime.add(Calendar.DAY_OF_WEEK, 7);
};
break;
case MONTHLY:
if(scheduleParts.length < 3){
throw new CloudRuntimeException("Incorrect schedule format: "+schedule+ " for interval type:"+type.toString());
}
minutes = Integer.parseInt(scheduleParts[0]);
hour = Integer.parseInt(scheduleParts[1]);
day = Integer.parseInt(scheduleParts[2]);
if(day > 28){
throw new CloudRuntimeException("Day cannot be greater than 28 for monthly schedule");
}
scheduleTime.set(Calendar.DAY_OF_MONTH, day);
scheduleTime.set(Calendar.HOUR_OF_DAY, hour);
scheduleTime.set(Calendar.MINUTE, minutes);
scheduleTime.set(Calendar.SECOND, 0);
scheduleTime.set(Calendar.MILLISECOND, 0);
execDate = scheduleTime.getTime();
// XXX: !execDate.after(startDate) is strictly for testing.
// During testing we use a test clock which runs much faster than the real clock
// So startDate and execDate will always be ahead in the future
// and we will never increase the time here
if (execDate.before(new Date()) || !execDate.after(startDate)) {
scheduleTime.add(Calendar.MONTH, 1);
}
break;
default:
throw new CloudRuntimeException("Incorrect interval: "+type.toString());
}
return scheduleTime.getTime();
}
// test only
public static void main(String[] args) {
TimeZone localTimezone = Calendar.getInstance().getTimeZone();
TimeZone gmtTimezone = TimeZone.getTimeZone("GMT");
TimeZone estTimezone = TimeZone.getTimeZone("EST");
Date time = new Date();
System.out.println("local time :" + getDateDisplayString(localTimezone, time));
System.out.println("GMT time :" + getDateDisplayString(gmtTimezone, time));
System.out.println("EST time :" + getDateDisplayString(estTimezone, time));
//Test next run time. Expects interval and schedule as arguments
if(args.length == 2) {
System.out.println("Next run time: "+ getNextRunTime(IntervalType.getIntervalType(args[0]), args[1], "GMT", time).toString());
}
time = new Date();
DateFormat dfDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'Z");
String str = dfDate.format(time);
System.out.println("Formated TZ time string : "+ str);
try {
Date dtParsed = DateUtil.parseTZDateString(str);
System.out.println("Parsed TZ time string : "+ dtParsed.toString());
} catch (ParseException e) {
}
}
}