Java tutorial
/** * Copyright (C) 2014 BigLoupe http://bigloupe.github.io/SoS-JobScheduler/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with 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 */ /********************************************************* begin of preamble ** ** Copyright (C) 2003-2012 Software- und Organisations-Service GmbH. ** All rights reserved. ** ** This file may be used under the terms of either the ** ** GNU General Public License version 2.0 (GPL) ** ** as published by the Free Software Foundation ** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file ** LICENSE.GPL included in the packaging of this file. ** ** or the ** ** Agreement for Purchase and Licensing ** ** as offered by Software- und Organisations-Service GmbH ** in the respective terms of supply that ship with this file. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS ** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS ** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ** POSSIBILITY OF SUCH DAMAGE. ********************************************************** end of preamble*/ package com.sos.scheduler.model.objects; import java.util.ArrayList; import java.util.List; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.Interval; public class JodaTools { /** * \brief calculate a date for a specific weekday based on a given date * \detail * @param date - the base date * @param weekday - the weekday * @return */ public static DateTime getNextWeekday(DateTime date, int weekday) { if (date.getDayOfWeek() > weekday) date = date.plusWeeks(1); return date.withDayOfWeek(weekday); } /** * \brief calculate a date for a specific weekday based on a given date * \detail * * @param date * @param weekday * @return */ public static DateTime getPreviousWeekday(DateTime date, int weekday) { if (date.getDayOfWeek() < weekday) date = date.minusWeeks(1); return date.withDayOfWeek(weekday); } /** * \brief calculate a date for a specific weekday based on a given date * \detail * @param date - the base date * @param weekday - the weekday * @return */ public static DateTime getWeekdayInMonth(DateTime date, int weekday, int which) { if (which < 0) { DateTime baseDate = getEndOfMonth(date); DateTime d = getPreviousWeekday(baseDate, weekday); int weeks = (which * -1) - 1; return d.minusWeeks(weeks); } DateTime baseDate = getStartOfMonth(date); DateTime d = getNextWeekday(baseDate, weekday); return d.plusWeeks(which - 1); } public static DateTime getWeekdayInIntervalOrNull(Interval interval, int weekday, int which) { DateTime currentDate = getStartOfMonth(interval.getStart()); DateTime result = getWeekdayInMonth(currentDate, weekday, which); while (!interval.contains(result)) { currentDate = currentDate.plusMonths(1); result = getWeekdayInMonth(currentDate, weekday, which); if (!result.isBefore(interval.getEnd())) return null; } return result; } public static DateTime getDayInMonth(DateTime date, int day) { DateTime baseDate = (day > 1) ? date.minusMonths(1) : date; DateTime result = getEndOfMonth(baseDate).plusDays(day); return result.minusMillis(result.getMillisOfDay()); } public static DateTime getDayInIntervalOrNull(Interval interval, int day) { DateTime currentDate = getStartOfMonth(interval.getStart()); DateTime result = getDayInMonth(currentDate, day); while (!interval.contains(result)) { currentDate = currentDate.plusMonths(1); result = getDayInMonth(currentDate, day); if (!result.isBefore(interval.getEnd())) return null; } return result; } /** * \brief converts a JobScheduler day String into a list of Joda Weekday constants * \detail * * @param jsDay * @return */ public static List<Integer> getJodaWeekdays(String jsDay) { List<Integer> result = new ArrayList<Integer>(); String[] arr = jsDay.split(" "); for (int i = 0; i < arr.length; i++) { result.add(getJodaWeekday(arr[i])); } return result; } /** * \brief converts a JS weekday in a Joda weekday * \detail * * @param jsWeekday * @return */ public static int getJodaWeekday(String jsWeekday) { String d = jsWeekday.toLowerCase(); if (d.length() > 2) d = d.substring(0, 2); if (d.equals("1") || d.equals("mo")) return DateTimeConstants.MONDAY; if (d.equals("2") || d.equals("tu") || d.equals("di")) return DateTimeConstants.TUESDAY; if (d.equals("3") || d.equals("we") || d.equals("mi")) return DateTimeConstants.WEDNESDAY; if (d.equals("4") || d.equals("th") || d.equals("do")) return DateTimeConstants.THURSDAY; if (d.equals("5") || d.equals("fr")) return DateTimeConstants.FRIDAY; if (d.equals("6") || d.equals("sa")) return DateTimeConstants.SATURDAY; return DateTimeConstants.SUNDAY; } public static DateTime getStartOfMonth(DateTime base) { return base.minusMillis(base.getMillisOfDay()).minusDays(base.getDayOfMonth() - 1); } public static DateTime getEndOfMonth(DateTime base) { return getStartOfMonth(base.plusMonths(1)).minusMillis(1); } public static DateTime getStartOfDay(DateTime base) { return base.minusMillis(base.getMillisOfDay()); } }