如何设置客户端特定的时区和日期

时间:2014-01-02 07:59:28

标签: date grails

如果它似乎是一个重复的问题,请原谅我。 我已经看过很多关于这个主题的帖子。但是在尝试了很多例子之后找不到解决我问题的方法。

我试过这段代码

SimpleDateFormat sdf =  new SimpleDateFormat("EEE MMM dd yyyy", Locale.ENGLISH )
Date newDate = sdf.parse(sdf.format( new Date( dateTimeString ) ) )

然而,第二行代码总是将日期转换为我不想要的服务器特定日期和时区。我也试过以下

    SimpleDateFormat sdf =  new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zzz", Locale.ENGLISH )


    log.info "+++++++++++++++++hidden date ++++++++ " + params.hiddenGameDateTime.substring(35, 38)
    log.info "x = " + sdf.format( new Date ( params.hiddenGameDateTime ))
    String tzone = params.hiddenGameDateTime.substring(35, 38)
    sdf.setTimeZone( TimeZone.getTimeZone( tzone ) )
    log.info "Timezone = " + sdf.getTimeZone().getDisplayName()

请注意

sdf.format( new Date( dateTimeString ) )

给了我想要的结果,但是它给了我日期的字符串值,并且要存储在数据库中的实际值是数据类型日期,它不能保存字符串值。 在我的情况下,日期和时间的值转换为PST日期和时间。我怎么能避免这种情况。带时区的用户输入日期应按原样存储在数据库中,日期和时区不得更改。

2 个答案:

答案 0 :(得分:1)

观察:不推荐使用构造函数new Date( dateTimeString )。更好的替代品将是这样的:

SimpleDateFormat sdfOriginal = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Date d = sdfOriginal.parse(dateTimeString);

此外:使用相同格式对象的sdf.parse(sdf.format(...))之类的表达式没有多大意义。

但最重要的是,您的声明“第二行代码始终将日期转换为特定于服务器的日期和时区”似乎基于测试输出,如:

System.out.println(newDate);

这隐式使用toString(),它基于jvm默认时区,在您的情况下是服务器时区。但请记住,j.u.Date的内部状态不引用任何时区。 Date只是一个long的容器,即UTC时区1970-01-01T00:00:00Z以来的秒数,也就是全球时间。

补充说明:

如果您需要客户端时区(在具有不同时区的多个用户的场景中)来创建用户特定的格式化日期字符串,那么您确实需要将每个用户的时区偏好存储在数据库中,因此您可以使用此信息在表达式中输出:

SimpleDateFormat sdf = new SimpleDateFormat("{pattern}";
sdf.setTimeZone(TimeZone.getTimeZone("{user-preference-time-zone}");
String userOutput = sdf.format(date);

答案 1 :(得分:0)

日期始终是特定于jvm的时区。您需要将其标准化为标准时间并将其存储在DB中以满足不同时区服务器的需要。