Data binding 播放框架:如何为用户输入的日期定义时区?

Data binding 播放框架:如何为用户输入的日期定义时区?,data-binding,date,playframework,timezone,Data Binding,Date,Playframework,Timezone,在my play framework应用程序中,用户可以选择输入时间表的日期,然后将该日期映射到我的模型实体: @InFuture @As("dd/MM/yyyy HH:mm") public Date validFrom; 这是表单中的字段 <input type="text" name="schedule.validFrom" placeholder="dd/mm/yyyy hh:mm"> 问题是,我们的服务器运行在非本地时区,时区应该取自为其制定此计划的对象 所以我预先

在my play framework应用程序中,用户可以选择输入时间表的日期,然后将该日期映射到我的模型实体:

@InFuture
@As("dd/MM/yyyy HH:mm")
public Date validFrom;
这是表单中的字段

<input type="text" name="schedule.validFrom" placeholder="dd/mm/yyyy hh:mm">

问题是,我们的服务器运行在非本地时区,时区应该取自为其制定此计划的对象

所以我预先知道这个时间表的时区,我不希望用户必须在字段中输入时区


一个可能的解决方案是以字符串形式提交日期并进行手动验证和解析,但我想知道是否有更好的解决方案。

更好的选择是为用户提供一个时区下拉列表。例如:

String TIMEZONE_ID_PREFIXES ="^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*";
String[] ids = TimeZone.getAvailableIDs();
Timezone tz = null;
for (int i=0; i<ids.length; i++) {
  if (ids[i].matches(TIMEZONE_ID_PREFIXES)) {  
    //add TimeZone.getTimeZone(ids[i]).getDisplayName() to a drop down list
  }
} 
String TIMEZONE_ID_PREFIXES=“^(非洲|美洲|亚洲|大西洋|澳大利亚|欧洲|印度|太平洋)/*”;
字符串[]id=TimeZone.getAvailableIDs();
时区tz=null;

对于(int i=0;i手动解析可能是最好的选择。
您可以创建自己的包含日期和时区的对象。

然后根据执行您自己的验证检查并执行时区转换。

这里的最佳实践实际上取决于您的用户是否需要查看多个时区

  • 如果它们不需要多个时区,那么您可以假设所有时间都是“无时区”的,即它们都是UTC或GMT。这是迄今为止最简单的选择

  • 如果用户需要查看多个时区,那么最好使用Z参数传递每个日期的时区:同时,在Javascript中,您可能希望使用库创建带有时区的日期字符串,例如:


时间表链接到具有固定时区的位置,不需要下拉菜单实际上是为了在验证/存储之前修改日期的解决方案:dateTime.toLocalDateTime().toDateTime(时区);它不是那么干净,但可以工作。