【问题标题】:Date values are incorrect日期值不正确
【发布时间】:2014-02-07 00:49:42
【问题描述】:

我正在使用 Android,试图实现一些可以告诉我多久以前有人玩过游戏的东西。这就是我所拥有的:

Date date;

try {
    date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(g.getLastPlayed());
    long milliseconds = date.getTime();
    long timeNow = new Date().getTime();
    DateUtils.
    String timeSince = (String) DateUtils.getRelativeTimeSpanString (milliseconds, timeNow, DateUtils.MINUTE_IN_MILLIS);
    TextView timeAgo = (TextView) convertView.findViewById(R.id.current_game_last_played_text);
    timeAgo.setText(timeSince + " " + timeNow);
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我在尝试过不同的路线时遇到了一些问题:

我尝试的一种方法是将数据库中的行设置为 DATETIMES,这就是您在尝试的第一行中看到的。将其转换为 SimpleDateFormat,因此我可以在此之后调用 getTime 并获取毫秒数。这似乎在我的模拟器上运行良好,但是当我把它放在手机上时,我得到了截然不同的结果。我进行了一些调试,发现毫秒的计算方式不同,具体取决于我使用的是模拟器、手机还是 Kindle。

有没有什么方法可以让毫秒无论在什么设备上总是相同的值?

我注意到的另一件事是,getTime 中的值似乎实际上是错误的。在 MySQL 中,当我执行 UNIX_TIMESTAMP(now()) 时,它会给出如下结果:

1391732897

虽然 getTime 在 Java 中让我得到这样的结果:

1391732385372

为什么 Java 这么长?

【问题讨论】:

  • Java 以毫秒为单位测量时间,而 Unix 时间戳以秒为单位。它们都起源于 1970-01-01,因此您只需乘以 1000 即可从一个转换为另一个。
  • “这么多”?你确定这不仅仅是秒和毫秒之间的差异吗?
  • 好吧,我最初的帖子实际上是不正确的。真正的问题是基于我运行它的位置错误地计算了毫秒。 timeNow 每次都是正确的。

标签: java android date datetime unix-timestamp


【解决方案1】:

MySQL 的 UNIX_TIMESTAMP() 以秒为单位提供时间,而 Java 的 new Date().getTime() 以毫秒为单位提供时间。

【讨论】:

  • 正确答案。所以解决方案是:乘以 1,000。
  • 是的,这个答案是正确的。 epx 只是给我带来了我的最终答案,所以我和他一起去了。
【解决方案2】:

我猜这个问题与时区有关。 Date.getTime() 以 UTC(格林威治)时间返回值,如果 getLastPlayed() 返回的字符串是本地时间,即使您在 1 秒前玩过,差异也可能有很多小时(取决于您的时区)。

【讨论】:

  • 那么我应该以什么格式将值保存在数据库中?实际时间无关紧要,因为它们永远不会显示给用户,所以我不在乎他们在哪个时区。我只关心时差。
  • 你应该使用相同的函数或方法来存储和比较,没有关系。例如,在两个实例中都使用 Date().getTime() 是可以的。
  • 好的,知道了。我能够通过将所有日期保存为数据库中的大整数来使其工作。基本上,当我插入时,我会这样做:UNIX_TIMESTAMP(now()) * 1000。所以当我得到它时,我根本不需要做任何解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2020-06-17
相关资源
最近更新 更多