我试过这段代码
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日期和时间。我怎么能避免这种情况。带时区的用户输入日期应按原样存储在数据库中,日期和时区不得更改。
答案 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中以满足不同时区服务器的需要。