/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and/or its affiliates * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech *******************************************************************************/ package org.eclipse.kura.web.client.util; import java.util.Date; import org.eclipse.kura.web.client.messages.Messages; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; public class DateUtils { private static final Messages MSGS = GWT.create(Messages.class); /** * formatDate takes a date an return its string representation */ public static String formatDateTime(Date d) { Date dNow = new Date(); DateTimeFormat dtf1 = DateTimeFormat.getFormat("yyyy.MM.dd 00:00:00.000 ZZZZ"); DateTimeFormat dtf2 = DateTimeFormat.getFormat("yyyy.MM.dd HH:mm:ss.SSS ZZZZ"); String today = dtf1.format(dNow); Date dToday = dtf2.parse(today); String date = null; @SuppressWarnings("unused") long lSecDiff = (dNow.getTime() - d.getTime()) / 1000; double dDayDiff = ((double) (d.getTime() - dToday.getTime())) / (86400000); // 1000 * 60 * 60 * 24 // if more in the future than tomorrow than format the date // even if it's just 2 days from today at midnight (day diff of 2 exactly) if (dDayDiff >= 2) { DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM); date = dtf.format(d); } // if the modification time is still tomorrow, or // exactly at midnight tomorrow, then // return something like "Tomorrow 10:30 am" else if (dDayDiff >= 1) { DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM); date = MSGS.tomorrow(dtf.format(d)); } // if the time difference is less than 1 hour // return something like "30 minutes ago" // else if (lSecDiff >= 0 && lSecDiff < 3600) { // // if ((lSecDiff / 60) < 1) { // date = lCtx.format(LocaleContext.RB.STR_LESS_THAN_ONE_MIN_AGO); // } else { // String mins = String.valueOf(lSecDiff / 60); // date = lCtx.format(LocaleContext.RB.STR_N_MIN_AGO, mins); // } // } // if the modification time is still today, or it is midnight // this same day (this morning), then // return something like "Today 10:30 am" else if (dDayDiff >= 0) { DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM); date = MSGS.today(dtf.format(d)); } // if the modification time is yesterday, // or exactly 1 day ago at midnight, then // return something like "Yesterday 10:30 am" else if (dDayDiff >= -1) { DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.TIME_MEDIUM); date = MSGS.yesterday(dtf.format(d)); } else { DateTimeFormat dtf = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM); date = dtf.format(d); } return date; } public static int getYear(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "yyyy" ).format(date)); } public static int getMonth(Date date) { //NB: The month in DateTimeFormat is not zero based [unlike Date() & Calendar()] so we need to subtract one when getting !!! return Integer.parseInt(DateTimeFormat.getFormat( "MM" ).format(date))-1; } public static int getDayOfMonth(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "dd" ).format(date)); } public static int getHour(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "HH" ).format(date)); } public static int getMinute(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "mm" ).format(date)); } public static int getSecond(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "ss" ).format(date)); } public static int getMillisecond(Date date) { return Integer.parseInt(DateTimeFormat.getFormat( "SSS" ).format(date)); } public static Date setYear(Date date, int year) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(pad(Integer.toString(year), 4)); sb.append(dateString.substring(5)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setMonth(Date date, int month) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 5)); //NB: The month in DateTimeFormat is not zero based [unlike Date() & Calendar()] so we need to add one when setting !!! sb.append(pad(Integer.toString(month+1), 2)); sb.append(dateString.substring(7)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setDayOfMonth(Date date, int dayOfMonth) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 8)); sb.append(pad(Integer.toString(dayOfMonth), 2)); sb.append(dateString.substring(10)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setToLastDayOfMonth(Date date) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 8)); switch(getMonth(date)) { case 0 : // Jan sb.append("31"); break; case 1 : // Feb if(isLeapYear(getYear(date))) { sb.append("29"); } else { sb.append("28"); } break; case 2 : // Mar sb.append("31"); break; case 3 : // Apr sb.append("30"); break; case 4 : // May sb.append("31"); break; case 5 : // June sb.append("30"); break; case 6 : // July sb.append("31"); break; case 7 : // August sb.append("31"); break; case 8 : // Sept sb.append("30"); break; case 9 : // Oct sb.append("31"); break; case 10 : // Nov sb.append("30"); break; case 11 : // Dec sb.append("31"); break; default : break; } sb.append(dateString.substring(10)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setHour(Date date, int hour) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 11)); sb.append(pad(Integer.toString(hour), 2)); sb.append(dateString.substring(13)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setMinute(Date date, int minute) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 14)); sb.append(pad(Integer.toString(minute), 2)); sb.append(dateString.substring(16)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setSecond(Date date, int second) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 17)); sb.append(pad(Integer.toString(second), 2)); sb.append(dateString.substring(19)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } public static Date setMillisecond(Date date, int millisecond) { String dateString = DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(date); StringBuilder sb = new StringBuilder(); sb.append(dateString.substring(0, 20)); sb.append(pad(Integer.toString(millisecond), 3)); return DateTimeFormat.getFormat("yyyy.MM.dd.HH.mm.ss.SSS").parse(sb.toString()); } private static String pad(String data, int size) { if(data.length() < size) { StringBuffer sb = new StringBuffer(); for(int i=0; i<(size-data.length()); i++) { sb.append("0"); } sb.append(data); return sb.toString(); } return data; } private static boolean isLeapYear(int year) { if(year % 4 == 0) { return true; } else { return false; } } }