我节省了在我的应用中显示的其他数据的时间。我将时间存储在db中的utc中。现在,当我在本地运行程序时它工作正常,但是当我在服务器上运行代码时,时间与utc不同。获取utc时间戳的代码是
private Timestamp getUTCTimestamp() throws ParseException
{
SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String utcTime = sdf.format(new Date());
SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
Timestamp dateToReturn = new Timestamp(((Date)dateFormat.parse(utcTime)).getTime());
return dateToReturn;
}
它返回acurate utc time但是当我在服务器上运行时它没有给出utc时间,例如我在本地运行程序它给了我“2016-04-17 20:58:55”这是正确的然后10分钟后,我在服务器上运行代码,它节省了时间“2016-04-17 16:02:46”,这是不同的。我的服务器位置在netharlands。我不明白,不应该到处都是相同的时间吗?
答案 0 :(得分:0)
如果要在DB上节省当前时间,最好使用MySQL的 NOW()函数进行保存,以确保代码运行的位置,只要DB是相同的,NOW()值将保持一致,您不需要创建时间对象和代码行来处理java端的当前时间。
请参阅:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now
答案 1 :(得分:0)
为什么要格式化然后解析格式化的字符串?只需使用:
private Timestamp getUTCTimestamp() throws ParseException
{
return new Timestamp(new Date().getTime());
}
关于你所看到的问题,我认为@Stanislav Palatnik的评论是正确的。您需要在解析时间字符串的格式上设置时区。或者只是使用相同的格式进行格式化和解析..但同样,为什么你甚至需要完成这项工作呢?
答案 2 :(得分:0)
您正在使用现已过时的旧麻烦课程。避免使用SimpleDateFormat,java.util.Date / .Calendar等,并尽量减少java.sql类型的使用。
他们的许多问题包括toString
方法的行为,在生成字符串时应用默认时区。这会混淆调试工作。
java.time类取代了旧的日期时间类。内置于Java 8及更高版本中,可用作Java 6和Java 6的后端口。 7和Android。
在java.time中执行您的业务逻辑。仅使用java.sql,直到更新JDBC驱动程序以直接处理java.time类型。
将列定义为接近SQL标准TIMESTAMP WITH TIME ZONE
的列。不是“没有”。
Instant
是UTC时间轴上的一个时刻。
Instant instant = Instant.now();
转换为java.sql.Timestamp以存储在数据库中。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
走向方向。
Instant instant = ts.toInstant();
生成日期时间值的文本表示时,java.time类中的toString
方法不应用神秘的时区。他们使用标准的ISO 8601格式进一步明确。
所以我们进出数据库 所有在UTC,没有时区,非常简单,非常清楚。
当您需要一个挂钟值(例如向用户远程呈现)时,Apple会立即获得ZonedDateTime
的时区。在Stack Overflow中的许多其他页面中详细介绍。
应为您的服务器分配UTC(或冰岛)时区。但永远不要依赖于此。使用上面显示的方法会使服务器的时区无关紧要。
答案 3 :(得分:0)
没有答案可以帮助我,因为我找到了原因并且它与代码无关。我在putty上运行了这个命令Date -u,并意识到时间与utc不同步,我不知道为什么。这篇文章帮助我解决了这个问题。我没有尝试过解决方案,所以如果有人有更好的解决方案,请随时告诉我:)这是 link