本地和服务器的UTC时间不同

时间:2016-04-17 21:50:17

标签: java datetime

我节省了在我的应用中显示的其他数据的时间。我将时间存储在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。我不明白,不应该到处都是相同的时间吗?

4 个答案:

答案 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.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