bha*_*mar 2 java calendar date
我正在从IST(印度时区的日期)的前端传递日期。在Java代码中,我使用以下代码将日期转换为日历(这是在美国PST时区中的服务器中发生的)。
Calendar cal = Calendar.getInstance();
int offset = date.getTimezoneOffset();
logger.info("Calendar Instance - " + cal);
cal.setTime(date);
logger.info("Calendar Instance after setting date - " + cal);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
logger.info("Calendar Instance after setting zeros - " + cal);
return cal;
Run Code Online (Sandbox Code Playgroud)
因此,当我看到最后一个日志时,该月的某天将比我过去的时间少一天。如果我通过2015年6月22日IST,它将转移到2015年6月21日。因此,经过最后处理后,它会在另一个UI页面中的数据列表中显示21/06/2015。
发生这种情况的原因是,默认情况下,服务器端的JVM和客户端的JVM使用不同的时区:Java TimeZone:
通常,您会使用getDefault获得一个TimeZone,它会根据程序运行的时区创建一个TimeZone。例如,对于在日本运行的程序,getDefault根据日语标准时间创建一个TimeZone对象。
我们可以看到,服务器上的太平洋时区的UTC?8:00,客户端的印度标准时间的UTC + 05:30。它们相差13.30,印度日期X转换为美国X-13.30,这可能导致某些X在服务器端发生在一天之前。
根据您如何影响/修改服务器和客户端应用程序,可能有几种解决方法。例如,您可以在服务器端和客户端使用UTC + 00:00时区中的日期。如果您需要向用户显示日期,则可以在需要时将其转换为印度时区。
// Set default GMT+0:00 time zone
TimeZone timeZone;
timeZone = TimeZone.getTimeZone("GMT+0:00");
TimeZone.setDefault(timeZone);
Run Code Online (Sandbox Code Playgroud)
除了Calendar cal = Calendar.getInstance();创建简单的日历外,您还可以创建“清除”日历,稍后您将使用该日历来设置日期,月份和年份
public static Calendar createClearedCalendar() {
Calendar cal = Calendar.getInstance();
cal.setTimeZone(timeZone);
cal.set(1970, 0, 1, 0, 0, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.clear(Calendar.MILLISECOND);
return cal;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您使用Java操作日期时间,则可以考虑使用Joda Time,它具有更多扩展选项和优化的性能。
| 归档时间: |
|
| 查看次数: |
8746 次 |
| 最近记录: |