【问题标题】:Parsing Date and time from "yyyy-MM-dd hh:mm:ss.SSS" -------> "hh:mm aa" in android从“yyyy-MM-dd hh:mm:ss.SSS”解析日期和时间------->“hh:mm aa”在android中
【发布时间】:2018-07-16 03:03:51
【问题描述】:

需要将时间转换成指定格式,但得到错误的结果。请帮忙

DateFormat readFormat = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss.sss"); 
DateFormat writeFormat = new SimpleDateFormat( "hh:mm aa");   //Expecting like 05:00 

String from = "2018-02-05 17:00:52.503";
String t0   = "2018-02-05 17:00:55.372";

Date date = null;  //IST
Date date2=null;
try {
    date = readFormat.parse(from);
    date2 =readFormat.parse(to);
} catch (ParseException e) {       
    e.printStackTrace();
}

if (date != null) {                       
    from = writeFormat.format(date);    //Expecting a result of 05.00 pm         
    to   = writeFormat.format(date2);   //Expecting a result of 05:00 pm

}
  • 列表项##需要这样输出##

    /*但是得到一个输出为:

                        from= "05:08 pm"    instead of 05:00 pm
                        to  = "05:06 pm"    instead of 05:00 pm
    

    */

【问题讨论】:

  • 试试simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
  • 只需阅读您自己的标题即可。 :-) 您需要仔细观察这些格式模式字母的大小写。在应该使用大写字母的地方使用小写字母非常容易,反之亦然。你需要大写的HH和大写的SSS
  • 顺便考虑一下扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。

标签: java android date date-formatting date-parsing


【解决方案1】:

SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");

【讨论】:

  • 这是对问题中格式模式字符串的改进,但仍无法正确解析2018-02-07 12:42:43.296。此外,仅代码的答案很少有帮助,更好地解释您如何解决问题,供我们大家学习。
【解决方案2】:

使用这个readFormat

SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

【讨论】:

    【解决方案3】:

    试试这个

    SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    SimpleDateFormat output = new SimpleDateFormat("hh:mm aa");
    
            Date d = null;
            Date d1 = null;
            try 
            {
                d = input.parse("2018-02-05 17:08:52.503");
                d1 = input.parse("2018-02-05 17:06:55.372");
    
            } catch (ParseException e) {
                e.printStackTrace();
            }
            String formatted = output.format(d);
            String formatted1 = output.format(d1);
    
            Log.i("DATE", "" + formatted);
            Log.i("DATE1", "" + formatted1);
    

    输出

    I/DATE: 05:08 PM
    I/DATE1: 05:06 PM
    

    编辑

    SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    SimpleDateFormat output = new SimpleDateFormat("hh:mm aa");
    
            Date d = null;
            Date d1 = null;
            try 
            {
                d = input.parse("2018-02-05 17:00:52.503");
                d1 = input.parse("2018-02-05 17:00:55.372");
    
            } catch (ParseException e) {
                e.printStackTrace();
            }
            String formatted = output.format(d);
            String formatted1 = output.format(d1);
    
            Log.i("DATE", "" + formatted);
            Log.i("DATE1", "" + formatted1);
    

    输出

    I/DATE: 05:00 PM
    I/DATE1: 05:00 PM
    

    【讨论】:

    • 你可以解析你的日期 2018-02-05 17:00:52.503 而不是我的日期 2018-02-05 17:08:52.503
    • @NithinN.j 请检查我的编辑答案。
    • @Nithin N.j 谢谢,很高兴为您提供帮助
    • 它有效。我刚刚声明了 DateFormat readFormat , DateFormat writeFormat 而不是 SimpleDateFormat readFormat 和 SimpleDateFormat writeFormat 。感谢兄弟的帮助...
    【解决方案4】:

    您的问题已经得到解答。我只是想证明 java.time,现代 Java 日期和时间 API,在帮助解析格式模式字母的非常常见的错误情况方面做得更好。让我们尝试将您的格式模式字符串与现代 DateTimeFormatter 一起使用:

        DateTimeFormatter readFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss.sss");
    

    这一行抛出java.lang.IllegalArgumentException: Too many pattern letters: s。所以不接受三个小写的s?它并没有告诉我们这个案例是错误的,毕竟它无法读懂我们的想法;但它确实指出了其中一个错误所在。让我们纠正一下:

        DateTimeFormatter readFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss.SSS");
        String from = "2018-02-05 17:00:52.503";
        LocalDateTime dateTime = LocalDateTime.parse(from, readFormatter);
    

    这次我们再往下写几行,然后点击java.time.format.DateTimeParseException: Text '2018-02-05 17:00:52.503' could not be parsed: Invalid value for ClockHourOfAmPm (valid values 1 - 12): 17。上午/下午的时钟时间?我们不是故意的,它再次非常精确地确定了错误的位置。也更正这个:

        DateTimeFormatter readFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    

    这一次,字符串会根据需要解析为2018-02-05T17:00:52.503

    在较新的 Android 上,您可以直接使用 java.time。对于较旧的 Android,请将 ThreeTenABP 添加到您的项目中,并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      猜你喜欢
      • 2022-11-16
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多