Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在gwt中通过屏幕保存日期时出现时区问题_Java_Gwt - Fatal编程技术网

Java 在gwt中通过屏幕保存日期时出现时区问题

Java 在gwt中通过屏幕保存日期时出现时区问题,java,gwt,Java,Gwt,我正在使用gwt应用程序。部署我的应用程序的服务器及其使用的数据库都在法国巴黎。在应用程序中,我有一个输入将保存到db的任何日期的规定 当我的应用程序从巴黎启动时,一切正常。 但当同一个应用程序从印度启动时,屏幕上输入的日期比输入的日期少1天。例如,在印度,我输入2014年7月16日b日期存储为2014年7月15日 我怀疑有地理问题。我是否需要更改代码以将日期保存到时区?或者与用户正在使用应用程序的计算机上的系统日期有关 我最喜欢的方法是将日期保存为调整为GMT午夜的长值: Long dateI

我正在使用gwt应用程序。部署我的应用程序的服务器及其使用的数据库都在法国巴黎。在应用程序中,我有一个输入将保存到db的任何日期的规定

当我的应用程序从巴黎启动时,一切正常。 但当同一个应用程序从印度启动时,屏幕上输入的日期比输入的日期少1天。例如,在印度,我输入2014年7月16日b日期存储为2014年7月15日


我怀疑有地理问题。我是否需要更改代码以将日期保存到时区?或者与用户正在使用应用程序的计算机上的系统日期有关

我最喜欢的方法是将日期保存为调整为GMT午夜的长值:

Long dateInMills = new Date().getTime();
dateInMills -= dateInMills % (24 * 60 * 60 * 1000));

// to show this date you can use, for example
DateTimeFormat.getFormat(PredefinedFormat.DATE_MEDIUM).format(new Date(dateInMills));
当您在GWT中显示该日期时,它将使用浏览器的默认时区来显示该日期

如果您想对其进行更多控制,例如,允许浏览器中只有一个时区的用户查看不同时区的日期,则必须将所需的时区对象传递给DateTimeFormatformat方法。

你应该研究一下计算机上的日期时间跟踪是如何工作的。从这个问题开始。对StackOverflow进行一些其他搜索,以找到许多有用的讨论和代码示例

基本上你的问题是许多其他问题的重复

不清楚的问题 你的问题没有提供足够的信息来帮助我们。您的GWT应用程序是如何从用户那里捕获日期时间的,具体数据类型是什么?服务器从何处存储日期时间值,并使用何种数据类型

一般提示 永远不要信任客户端计算机上的日期时间。如果可能的话,请在当前时刻始终使用您自己的服务器

服务器应设置为UTC时区,或者如果在操作系统中物理上不可能,则应设置为UTC时区

将您的所有业务逻辑和数据存储保存在中。仅在向用户演示时需要转换为时区

永远不要依赖JVM当前默认时区的隐式使用。始终指定所需/预期时区

永远不要使用java.util.Date/.Calendar类。它们是出了名的麻烦、混乱和缺陷。取而代之的是使用Joda Time的内置Java 8

如果将日期时间值序列化为文本,请使用标准格式,如2014-10-21T07:11:31.028Z

Joda Time 2.5中的示例代码

DateTimeZone zoneParis = DateTimeZone.forID( "Europe/Paris" );
DateTimeZone zoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );

DateTime nowUtc = DateTime.now( DateTimeZone.UTC );
DateTime nowParis = now.withZone( zoneParis );
DateTime nowKolkata = now.withZone( zoneKolkata );
默认情况下,Joda Time和java.Time都以ISO 8601格式解析和生成字符串

String output = nowUtc.toString();
如果需要,请转换为java.util.Date

java.util.Date date = newUtc.toDate();

虽然很多人都是从大纪元开始计算时间,但我不同意这种说法。使调试和健全性检查变得困难(如果不是不可能的话)。问题值不再明显。可能会混淆,因为不同的工具/环境使用不同的纪元和不同的计数分辨率整秒、毫秒、微秒和纳秒。Java库、JDBC驱动程序和数据库都是为了处理跟踪日期时间的细节而构建的,所以就让它们来吧。您执行位级算术吗?按八位字节处理文本?我们有课程和图书馆为我们做这项工作。如果你有足够的时间,每个问题都可能被过度设计。然而,对于大多数基于web的应用程序来说,将日期存储为长值并使用标准GWT DateTimeFormat对象显示它们是非常好的。GWT目前既不支持Joda,也不支持Java 8。@AndreiVolgin A作者没有真正确定数据的来源和处理方法,如我的答案顶部所述。B这个问题带有一个java标记。C有一些方法来传递java值,包括JoDaTime /java.时间与GWT,例如框架。我认为在提供答案时考虑所有相关标签是很重要的。