package com.thinkbiganalytics; /*- * #%L * thinkbig-commons-util * %% * Copyright (C) 2017 ThinkBig Analytics * %% * 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. * #L% */ import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.Period; import org.joda.time.ReadWritablePeriod; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.PeriodFormatter; import org.joda.time.format.PeriodFormatterBuilder; import org.joda.time.format.PeriodParser; import java.util.Arrays; import java.util.Date; import java.util.Locale; /** * Utility for common DateTime functions */ public class DateTimeUtil { static PeriodFormatter periodFormatter = new PeriodFormatterBuilder().append(null, new StringPeriodParser()).toFormatter(); public static DateTimeFormatter utcDateTimeFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").withZoneUTC(); public static DateTimeFormatter dateTimeFormatWithTimeZone = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z"); public static Date convertToUTC(Date date) { DateTime time = new DateTime(date.getTime()); DateTimeZone dtZone = DateTimeZone.forID("UTC"); DateTime utc = time.withZone(dtZone); return utc.toDate(); } public static DateTime convertToUTC(DateTime date) { DateTimeZone dtZone = DateTimeZone.forID("UTC"); DateTime utc = date.withZone(dtZone); return new DateTime(utc); } public static Date getUTCTime() { return convertToUTC(new Date()); } public static DateTime getNowUTCTime() { return convertToUTC(DateTime.now()); } /** * @return a Date Time string along with the current time zone */ public static String getNowFormattedWithTimeZone() { return dateTimeFormatWithTimeZone.print(DateTime.now()); } /** * Parse a string period into a Joda time period * i.e. 3Y, 20W * * @param period a string period (i.e. 3Y, 20W) * @return return the period */ public static Period period(String period) { return periodFormatter.parsePeriod(period); } public static class StringPeriodParser implements PeriodParser { private Integer getValue(String part, String unit) { String val = part.substring(0, part.indexOf(unit)); return val.length() > 0 ? Integer.valueOf(val) : 0; } private DATE_PART getDatePart(String part) { if (part.contains(DATE_PART.YEAR.abbreviation)) { return DATE_PART.YEAR; } else if (part.contains(DATE_PART.MONTH.abbreviation)) { return DATE_PART.MONTH; } else if (part.contains(DATE_PART.WEEK.abbreviation)) { return DATE_PART.WEEK; } else if (part.contains(DATE_PART.DAY.abbreviation)) { return DATE_PART.DAY; } else if (part.contains(DATE_PART.HOUR.abbreviation)) { return DATE_PART.HOUR; } else if (part.contains(DATE_PART.MINUTE.abbreviation)) { return DATE_PART.MINUTE; } else if (part.contains(DATE_PART.SECOND.abbreviation)) { return DATE_PART.SECOND; } else { return null; } } private void addToPeriod(ReadWritablePeriod period, String part) { DATE_PART datePart = getDatePart(part); Integer value = getValue(part, datePart.abbreviation); switch (datePart) { case YEAR: period.addYears(getValue(part, datePart.abbreviation)); break; case MONTH: period.addMonths(getValue(part, datePart.abbreviation)); break; case WEEK: period.addWeeks(getValue(part, datePart.abbreviation)); break; case DAY: period.addDays(getValue(part, datePart.abbreviation)); break; case HOUR: period.addHours(getValue(part, datePart.abbreviation)); break; case MINUTE: period.addMinutes(getValue(part, datePart.abbreviation)); break; case SECOND: period.addSeconds(getValue(part, datePart.abbreviation)); break; default: break; } } @Override public int parseInto(ReadWritablePeriod period, String periodStr, int position, Locale locale) { String parts[] = periodStr.split(" "); period.addYears(0); period.addMonths(0); period.addWeeks(0); period.addDays(0); period.addHours(0); period.addMinutes(0); period.addSeconds(0); Arrays.asList(parts).stream().forEach(part -> addToPeriod(period, part)); return periodStr.length(); } enum DATE_PART { YEAR("Y"), MONTH("M"), WEEK("W"), DAY("D"), HOUR("h"), MINUTE("m"), SECOND("s"); private String abbreviation; DATE_PART(String abbreviation) { this.abbreviation = abbreviation; } } } }