/** * DateConvert.java This file is part of WattDepot. * <p/> * Copyright (C) 2013 Cam Moore * <p/> * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * <p/> * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * <p/> * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.wattdepot.common.util; import org.wattdepot.common.domainmodel.Labels; import org.wattdepot.common.util.tstamp.Tstamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; /** * DateUtilities - Utility functions dealing with java.util.Date and * java.xml.datatype.XMLGregorianCalendar instances. * * @author Cam Moore * */ public class DateConvert { /** * Parses the given String representation of an XMLGregorianCalendar and * returns the instance. * * @param s * The String representation of an XMLGregorianCalendar with the * format yyyy-MM-dd'T'HH:mm:ss.SSS * @return The XMLGregorianCalendar instance. * @throws ParseException * if the string has the wrong format. * @throws DatatypeConfigurationException * if there is a problems instantiating the DatatypeFactory. */ public static XMLGregorianCalendar parseCalString(String s) throws ParseException, DatatypeConfigurationException { XMLGregorianCalendar result = null; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); result = convertDate(simpleDateFormat.parse(s)); return result; } /** * @param s * The String representation in the format yyyy-MM-dd'T'HH:mm:ss.SSS. * @return The Date instance for the time. * @throws ParseException * if the string has the wrong format. * @throws DatatypeConfigurationException * if there is a problem initializing the DatatypeFactory. */ public static Date parseCalStringToDate(String s) throws ParseException, DatatypeConfigurationException { return convertXMLCal(parseCalString(s)); } /** * Converts a java.util.Date to a javax.xml.datatype.XMLGregorianCalendar. * * @param date * The Date to convert. * @return The XMLGregorianCalendar representation of the given Date. * @throws DatatypeConfigurationException * if there is a problem instantiating the DatatypeFactory. */ public static XMLGregorianCalendar convertDate(Date date) throws DatatypeConfigurationException { XMLGregorianCalendar result = null; GregorianCalendar gregorianCalendar = (GregorianCalendar) GregorianCalendar.getInstance(); gregorianCalendar.setTime(date); result = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); return result; } /** * Converts the given XMLGregorianCalendar to a java.util.Date. * * @param xgc * The XMLGregorianCalendar. * @return The Date representation of the XMLGregorianCalendar. */ public static Date convertXMLCal(XMLGregorianCalendar xgc) { return xgc.toGregorianCalendar().getTime(); } /** * Returns the beginning of the hour or day given the time and hour or daily choice. * @param time the current time. * @param hourlyDailyChoice how wide the window should be. * @return the beginning of the window based upon the current time and window width. */ public static XMLGregorianCalendar getBeginning(XMLGregorianCalendar time, String hourlyDailyChoice) { XMLGregorianCalendar begin = null; if (hourlyDailyChoice.equals(Labels.HOURLY)) { begin = Tstamp.makeTimestamp(time.toGregorianCalendar().getTimeInMillis()); begin.setMinute(0); begin.setSecond(0); begin.setMillisecond(0); } else if (hourlyDailyChoice.equals(Labels.DAILY)) { begin = Tstamp.makeTimestamp(time.toGregorianCalendar().getTimeInMillis()); begin.setHour(0); begin.setMinute(0); begin.setSecond(0); begin.setMillisecond(0); } return begin; } /** * Returns the end of the hour or day give the time and the hour or daily choice. * @param time the current time. * @param hourlyDailyChoice the width of the window. * @return the end of the window based upon the current time and the window width. */ public static XMLGregorianCalendar getEnding(XMLGregorianCalendar time, String hourlyDailyChoice) { XMLGregorianCalendar end = null; if (hourlyDailyChoice.equals(Labels.HOURLY)) { end = Tstamp.incrementHours(time, 1); end.setMinute(0); end.setSecond(0); end.setMillisecond(0); } else if (hourlyDailyChoice.equals(Labels.DAILY)) { end = Tstamp.incrementDays(time, 1); end.setHour(0); end.setMinute(0); end.setSecond(0); end.setMillisecond(0); } return end; } }