I use the calendar Primefaces component with timeOnly and timeZone attributes for using only hour format (HH:mm). Like this:
<p:calendar id="xabsOvertimeTimeFrom" pattern="HH:mm" timeOnly="true" value="#{data.dateFrom}" timeZone="#{data.timeZone}"/>We can convert the value of #{data.dateFrom} from GMT/UTC time zone to local, conversely, from local time zone to GMT/UTC time zone. Here is my functions:
package vn.nvanhuong.timezoneconverter;And Unit test for them:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class TimeZoneConverter {
/**
* convert a date with hour format (HH:mm) from local time zone to UTC time zone
*/
public static Date convertHourToUTCTimeZone(Date inputDate) throws ParseException {
if(inputDate == null){
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(inputDate);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
String dateString = ""+((hours>9)?""+hours:"0"+hours)+":"+((hours>9)?""+minutes:"0"+minutes)+"";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
return sdf.parse(dateString);
}
/**
* convert a date with hour format (HH:mm) from UTC time zone to local time zone
*/
public static Date convertHourFromUTCToLocalTimeZone(Date inputDate) throws ParseException {
if(inputDate == null){
return null;
}
Date localFromGmt = new Date(inputDate.getTime() - TimeZone.getDefault().getOffset(inputDate.getTime()));
Calendar calendar = Calendar.getInstance();
calendar.setTime(localFromGmt);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
String dateString = ""+((hours>9)?""+hours:"0"+hours)+":"+((hours>9)?""+minutes:"0"+minutes)+"";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
return sdf.parse(dateString);
}
}
package vn.nvanhuong.timezoneconverter.test;
import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.junit.Test;
import vn.nvanhuong.timezoneconverter.TimeZoneConverter;
public class TimeZoneConverterTest {
@Test
public void testConvertHourToUTCTimeZoneWhenNull() throws ParseException {
Date inputDate = null;
Date expected = null;
Date actual = TimeZoneConverter.convertHourToUTCTimeZone(inputDate);
assertEquals(expected,actual);
}
@Test
public void testConvertHourToUTCTimeZoneWhenNotNull() throws ParseException {
SimpleDateFormat isoFormat = new SimpleDateFormat("HH:mm");
Date inputDate = isoFormat.parse("19:21");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date expected = isoFormat.parse("19:21");
Date actual = TimeZoneConverter.convertHourToUTCTimeZone(inputDate);
assertEquals(expected,actual);
}
@Test
public void testConvertHourToDefaultTimeZoneNull() throws ParseException {
Date inputDate = null;
Date expected = null;
Date actual = TimeZoneConverter.convertHourFromUTCToLocalTimeZone(inputDate);
assertEquals(expected,actual);
}
@Test
public void testConvertHourToDefaultTimeZoneNotNull() throws ParseException {
SimpleDateFormat isoFormat = new SimpleDateFormat("HH:mm");
Date expected = isoFormat.parse("09:21");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date inputDate = isoFormat.parse("09:21"); //16:21
Date actual = TimeZoneConverter.convertHourFromUTCToLocalTimeZone(inputDate);
assertEquals(expected, actual);
}
}
Hope that is useful for everyone! ;)