【问题标题】:SimpleDateFormat returning current date or delayed by a monthSimpleDateFormat 返回当前日期或延迟一个月
【发布时间】:2016-01-01 17:57:31
【问题描述】:

我正在编写一个简单的代码以从服务器获取 UTC 日期,然后根据前面提到的 timeDiff 将其转换为本地时间。下面是简单的代码:

来自 App.Constants 接口:

    SimpleDateFormat SDF_yyyyMMdd_HHmmss_SSS = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS", Locale.ENGLISH);


public String getEnddate(Context context) throws ParseException {
    Date date = App.Constants.SDF_yyyyMMdd_HHmmss_SSS.parse(enddate);
    Log.d("Check these dates", "Check dates EventEnd: " + enddate + date.toString());
    MyDate tmpDate = new MyDate(date); //May ignore this
    return tmpDate.toSQLite(App.getTimeDiff(context)); //May ignore this
}

虽然我得到的结果很有趣。虽然 80% 的日期被正确转换,但随机: 1. 在某些情况下,SDF 会返回当前日期和时间 2. 在某些情况下,自卫队的返回时间正好延迟了一个月。

以下是从日志中选定的行转储。在下面的前三个实例中,返回的日期是当前日期。在第四个例子中,日期延迟了一个月,但返回的时间是当前时间。在最后一种情况下,返回的日期与原始日期相比正好延迟了一个月。

01-01 21:33:30.869 24135-24135/? D/检查这些日期:检查日期 EventEnd: 20151222_003819_453Fri Jan 01 21:33:19 IST 2016

01-01 21:33:30.900 24135-24135/? D/检查这些日期:检查日期 EventEnd: 20151222_004950_104Fri Jan 01 21:33:50 IST 2016

01-01 21:33:30.961 24135-24135/? D/检查这些日期:检查日期 EventEnd: 20151226_235500_000Fri Jan 01 21:33:30 IST 2016

01-01 21:33:30.971 24135-24135/? D/检查这些日期:检查日期 EventEnd:20151227_060800_000Wed Jan 27 21:33:00 IST 2016

01-01 23:17:07.977 31293-31293/? D/检查这些日期:检查日期 EventEnd: 20151222_195508_303Fri Jan 22 19:55:08 IST 2016 0

希望有人可以提供帮助。否则,我只是太想写我自己的字符串到日期转换。我真的希望我不必!!!

编辑: 太不耐烦了,很快就写了下面的解析器。使用此解析器,代码可以正常工作,正如预期的那样。但不是 SimpleDateFormat。

public static Date localDateParser(String yyyyMMdd_HHmmss_SSS){
    int year = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(0, 4));
    int month = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(4, 6)) - 1;
    int day = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(6, 8));

    int hour = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(9, 11));
    int minute = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(11, 13));
    int second = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(13, 15));
//    int ms = Integer.parseInt(yyyyMMdd_HHmmss_SSS.substring(16));


    GregorianCalendar cal = new GregorianCalendar(year, month, day, hour, minute, second);
    new Date(cal.getTimeInMillis()).toString());
    return new Date(cal.getTimeInMillis());
}

【问题讨论】:

  • 可以打印原始字符串吗?

标签: android date simpledateformat


【解决方案1】:

请将 date.toString() 更改为

App.Constants.SDF_yyyyMMdd_HHmmss_SSS.format(date)。

Date.toString() 没有按您的意愿工作。

【讨论】:

  • 不,这不是 date.toString() 的问题,toString() 只是为了打印日志。我没有在其他任何地方使用 toString() 。稍后在代码中,我比较返回的日期,得到错误的结果。所以 SimpleDateFormat 似乎返回了错误的日期。我彻底困惑了。
  • 您可以尝试使用 App.Constants.SDF_yyyyMMdd_HHmmss_SSS.format(date) 而不是 data.toString() 吗?
  • 在 App.Constants.SDF_yyyyMMdd_HHmmss_SSS 中,月份是从 1 到 12。但在 Date.toString() 中,月份是从 0 到 11。所以 2015-12 变为 2016-1。
  • 感谢您的建议,但我认为这不是问题所在。正如我所提到的,在 40-50 个奇怪的条目中,大多数条目都从 String 更新到 date 就好了。随机选择的少数给出错误的结果。每次我运行该应用程序时,都会产生不同的转换结果。我只共享了给出错误结果的条目的日志,而不是整个日志。如果您看到我在原始请求中发布的 EDIT,那么它 100% 的时间都可以正常工作。没有问题..
猜你喜欢
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多