我有用户在创建帐户时设置时区。他们的帐户可能会在这么多天后过期,用户可以搜索在X天到期的帐户。搜索运行时,它使用浏览器的时区而不是用户时区。我像这样设置了时区:
CountryDAO countryDao = new CountryDAO();
String timezone = countryDao.findTimezone(advisor.getPlannerID());
TimeZone.setDefault(TimeZone.getTimeZone(timezone));
DateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(TimeZone.getDefault());
此代码未设置服务器的时区。我使用datapicker来选择日期和搜索,但它仍然使用GMT而不是设置的时区。
如何使用设定的时区?
答案 0 :(得分:1)
作为correct answer by Meno Hochschild,java.util.TimeZone.setDefault()
是影响整个JVM的静态方法。不是你想要的。
避免使用java.util.Date&日历类。它们的设计和实施都很糟糕。
相反,请使用Joda-Time库来操纵日期时间。几乎所有的Joda-Time都是不可变的和线程安全的。因此它适用于servlet& JSP。
通常,您希望使用UTC / GMT,这意味着没有时区偏移。在向用户呈现时,然后本地化为特定时区,格式和语言。
我不知道你是怎么做的,但似乎你正在确定用户的时区。好。 (a)确保您的时区字符串是name of a time zone而不是过时的3字母代码。这些3字母代码既不标准也不唯一。 (b)如果您使用某种JavaScript或其他技巧来检测和报告客户端计算机上的系统设置,请考虑为用户提供一种选择时区的方法。用户可能在一个时区中“思考”,而他们的机器设置为另一个时区。
使用该时区名称字符串在Joda-Time中实例化DateTimeZone。将timeZone作为各种Joda-Time方法的参数传递。
DateTimeZone timeZone = DateTimeZone.forId( timeZoneName );
在Joda-Time中,DateTime知道自己的时区(与java.util.Date相比)。如果未指定时区,则会获得JVM的默认时区。重要提示:始终指定时区而不是依赖默认值,以避免在生产中运行时出现意外情况。
DateTime dateTimeInUTC = new DateTime( DateTimeZone.UTC );
DateTime dateTimeInParis = dateTimeInUTC.toDateTime( DateTimeZone.forId( "Europe/Paris" ) );
您可以在Joda-Time中添加和减去年,月,日,小时等。比较方法测试日期是在彼此之前还是之后。要查找一天的开头,请致电withTimeAtStartOfDay
(不要只将小时数设置为零,因为并非所有区域的所有日期都在午夜开始)。
DateTime aWeekAgoDateTime = new DateTime( timeZone ).withTimeAtStartOfDay().minusWeeks( 1 ).withTimeAtStartOfDay();
…
boolean isMoreThanWeekOld = someDateTime.isBefore( aWeekAgoDateTime );
除此之外,我再也忍不住了。你的问题不明确。什么搜索?一个数据库?数组或其他集合?在客户端的JavaScript?在Java服务器上?
答案 1 :(得分:0)
TimeZone.setDefault(...)
正在为所有用户静态设置JVM的时区(此处在服务器上)。我假设你想要设置当前用户会话的时区。如果是这样,那么您需要一个特殊的jsp会话属性,您可以在其中存储和读取用户的时区偏好。