【问题标题】:Android SimpleDateFormat returning incorrect time between midnight and 1amAndroid SimpleDateFormat 在午夜和凌晨 1 点之间返回不正确的时间
【发布时间】:2016-01-07 15:59:42
【问题描述】:

已解决 我发现在午夜和凌晨 1 点之间,我的设备会在 1 小时后返回一个时间(每天其他 23 小时它会正确返回)。更奇怪的是,如果我使用kk 而不是HH,它会正确返回(尽管结果字符串对我没有用)

我正在运行的代码:(在这种情况下,strFormat 匹配 df3 中的硬编码字符串)

SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US);
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US);
SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);

Date d = c.getTime();
String s = d.toString();
String ret = df.format(c.getTime());
String ret2 = df.format(new Date(System.currentTimeMillis()));
String ret3 = df2.format(c.getTime());
String ret4 = df3.format(c.getTime());
String r1 = ""+c.get(Calendar.HOUR);

这些返回:

s = "Thu Jan 07 00:39:32 GMT-11:00 2016"
ret = "2016-01-07 01:39:32"
ret2 = "2016-01-07 01:39:32"
ret3 = "2016-01-07 24:39"
ret4 = "2016-01-07 01:39:32.525"
r1 = "0"

凌晨 1 点后这些返回:

s = "Thu Jan 07 01:07:09 GMT-11:00 2016"
ret = "2016-01-07 01:07:09"
ret2 = "2016-01-07 01:07:09"
ret3 = "2016-01-07 01:07"
ret4 = "2016-01-07 01:07:09.606"
r1 = "1"

非常感谢我做错了什么/出了什么问题的任何帮助。

更新

将代码更改为:

SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US);
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
        SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm zzz", Locale.US);
        df2.setTimeZone(TimeZone.getTimeZone("GMT"));
        SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz", Locale.US);
        df3.setTimeZone(TimeZone.getTimeZone("GMT"));
        Date d = c.getTime();
        String s = d.toString();
        String ret = df.format(c.getTime());
        String ret2 = df.format(new Date(System.currentTimeMillis()));
        String ret3 = df2.format(c.getTime());
        String ret4 = df3.format(c.getTime());
        String r1 = ""+c.get(Calendar.HOUR);
        return ret;

我得到相同的结果:

s = "Fri Jan 08 00:52:05 GMT 2016"
ret = "2016-01-08 01:52:05"
ret2 = "2016-01-08 01:52:05"
ret3 = "2016-01-08 24:52 GMT"
ret4 = "2016-01-08 01:52:05.169 GMT"
r1 = "0"

s = "Fri Jan 08 01:03:23 GMT 2016"
ret = "2016-01-08 01:03:23"
ret2 = "2016-01-08 01:03:23"
ret3 = "2016-01-08 01:03 GMT"
ret4 = "2016-01-08 01:03:23.547 GMT"
r1 = "1"

所以问题似乎与 TimeZone 无关

【问题讨论】:

  • 你的时区是多少?
  • 您确定在这 40 分钟内您没有更改代码中的任何内容吗?
  • 添加“ZZZZ”查看SimpleDateFormat中的时区,可能不一样
  • 我已经在运行 4.1.3 的三星 S3 和 4.1.2 的模拟器上尝试了您的代码,一切正常。你可以试试其他设备吗?
  • 'H' 在 API 级别 here (SO) 和 here (Android Bugtracker)。其他我怀疑所描述的行为可能与 this 错误有关。

标签: java android simpledateformat


【解决方案1】:

可能你必须为你的 dateFormat 对象设置时区。

我试过这个:

    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT-11:00"), Locale.US);
    c.set(2016, 0, 7, 00, 39, 32);
    Date date  = c.getTime();

    SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
    df.setTimeZone(TimeZone.getTimeZone("GMT-11:00"));
    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US);
    df2.setTimeZone(TimeZone.getTimeZone("GMT-11:00"));
    SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);
    df3.setTimeZone(TimeZone.getTimeZone("GMT-11:00"));

    String ret = df.format(date.getTime());
    String ret2 = df.format(date.getTime());
    String ret3 = df2.format(date.getTime());
    String ret4 = df3.format(date.getTime());

    System.out.println("  ret : "+ret);
    System.out.println("  ret2 : "+ret2);
    System.out.println("  ret3 kk: "+ret3);
    System.out.println("  ret4 : "+ret4);

结果是正确的:

 ret : Thu Jan 07 00:39:32 GMT-11:00 2016
 ret2 : Thu Jan 07 00:39:32 GMT-11:00 2016
 ret3 kk: 2016-01-07 24:39
 ret4 : 2016-01-07 00:39:32.217

【讨论】:

  • 使用df.setTimeZone(TimeZone.getTimeZone("GMT"));我仍然得到相同的结果
【解决方案2】:

Idk...老实说。我尝试重新解决您的问题,但在 PC 上的 Eclipse 中,而不是在 Android 中。这是我用的:

    Calendar c = new GregorianCalendar(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11))), Locale.US);
    c.set(2016, 0, 7, 0, 7);

    String strFormat = "yyyy-MM-dd HH:mm:ss.SSS";


    SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US);
    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US);
    SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);

    Date d = c.getTime();
    String s = d.toString();
    String ret = df.format(c.getTime());
    String ret2 = df.format(new Date(System.currentTimeMillis()));
    String ret3 = df2.format(c.getTime());
    String ret4 = df3.format(c.getTime());
    String r1 = ""+c.get(Calendar.HOUR);

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n%n", s, ret, ret2, ret3, ret4, r1);

    df.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11))));
    df2.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11))));
    df3.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11))));

    d = c.getTime();
    s = d.toString();
    ret = df.format(c.getTime());
    ret2 = df.format(new Date(System.currentTimeMillis()));
    ret3 = df2.format(c.getTime());
    ret4 = df3.format(c.getTime());
    r1 = ""+c.get(Calendar.HOUR);

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n%n", s, ret, ret2, ret3, ret4, r1);

    c.set(2016, 0, 7, 1, 7);

    d = c.getTime();
    s = d.toString();
    ret = df.format(c.getTime());
    ret2 = df.format(new Date(System.currentTimeMillis()));
    ret3 = df2.format(c.getTime());
    ret4 = df3.format(c.getTime());
    r1 = ""+c.get(Calendar.HOUR);

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n", s, ret, ret2, ret3, ret4, r1);

这就是我得到的:

s = Thu Jan 07 12:07:58 CET 2016
ret = 2016-01-07 12:07:58.662
ret2 = 2016-01-07 17:55:58.697
ret3 = 2016-01-07 12:07
ret4 = 2016-01-07 12:07:58.662
r1 = 0

s = Thu Jan 07 12:07:58 CET 2016
ret = 2016-01-07 00:07:58.662
ret2 = 2016-01-07 05:55:58.718
ret3 = 2016-01-07 24:07
ret4 = 2016-01-07 00:07:58.662
r1 = 0

s = Thu Jan 07 13:07:58 CET 2016
ret = 2016-01-07 01:07:58.662
ret2 = 2016-01-07 05:55:58.722
ret3 = 2016-01-07 01:07
ret4 = 2016-01-07 01:07:58.662
r1 = 1

也许你的 SimpleDateFormat 有问题,它使用不同的时区...这真的很有趣。

【讨论】:

  • 使用 df.setTimeZone(TimeZone.getTimeZone("GMT")); 我仍然得到相同的结果
【解决方案3】:

可能: c.getTime() 返回您的当前时间,SimpleDateFormat 将其格式化为 Locale.US。美国是一个拥有不同时区的大国,您的设备时区可能与 Locale.US 不同! 删除 Locale.US 并让我们随时发布。

【讨论】:

  • 我不这么认为。定义一个 Locale 只是以不同的方式格式化日期,它不会改变时区。
【解决方案4】:

问题出在平板电脑本身 - 它们内置了额外的传感器,一旦访问就会弄乱内部时钟。 谢谢大家的帮助

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多