【问题标题】:Wrong output in parsing Date from DateFormat Using Calendar使用日历从 DateFormat 解析日期时输出错误
【发布时间】:2014-06-13 11:01:16
【问题描述】:

我的代码有什么问题,我无法从我想要解析的日期时间获得确切的输出?

String convertDate="03/19/2014 5:30:10 PM";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.CANADA);
Date myDate=new Date();
try {
    myDate=df.parse(convertDate);
    final Calendar c = Calendar.getInstance();
    c.setTime(myDate);
    System.out.println("Year = " + c.get(Calendar.YEAR));
    System.out.println("Month = " + (c.get(Calendar.MONTH)));

    System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
} catch (ParseException e1) {
    e1.printStackTrace();
}

我的输出是

 - 04-28 03:07:15.322: I/System.out(25095): Year = 2015
 - 04-28 03:07:15.322: I/System.out(25095): Month = 6
 - 04-28 03:07:15.322: I/System.out(25095): Day = 3

应该是

 - Year = 2014
 - Month = 03
 - Day = 19

【问题讨论】:

  • 记住 c.get(Calendar.MONTH) 是从零开始的(例如,一月是第 0 个月,等等)。

标签: java android datetime calendar simpledateformat


【解决方案1】:

从此更改您的日期格式

dd/MM/yyyy HH:mm:ss

到这里

MM/dd/yyyy HH:mm:ss

月份是基于Zero (0) 索引的。因此,在检索月份索引后,您必须添加 1 才能获取当前月份。

所以,尝试按如下方式打印当前月份...

int currentMonth = c.get(Calendar.MONTH) + 1;

System.out.println("Month = " + currentMonth);

或者

System.out.println("Month = " + (c.get(Calendar.MONTH)+1));

【讨论】:

  • 我也试过了,但它仍然是一个错误的输出,它给了我一个 Month = 21
  • 我已经将我的格式化程序更改为 DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aa", Locale.CANADA);
  • Month 索引和1 被连接为String,这就是输出为21 的原因。
  • 我没有加括号是我的错。
【解决方案2】:
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.CANADA);

现在试试……它会起作用的。

有了这个,你必须在你的月份加上 1。代码在这里:

 String convertDate="03/19/2014 5:30:10 PM";
         DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.CANADA);
         Date myDate=new Date();
         try {
            myDate=df.parse(convertDate);
            final Calendar c = Calendar.getInstance();
            c.setTime(myDate);
            int y,m,d;
            y=Calendar.YEAR;
            System.out.println("Year = " + c.get(Calendar.YEAR));
            //Log.d("Year", y);
            System.out.println("Month = " + (c.get(Calendar.MONTH)+1));

            System.out.println("Day = " + c.get(Calendar.DATE));
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

【讨论】:

  • "MM/dd/yyyy HH:mm:ss" 不是 "03/19/2014 5:30:10 PM" 的格式,结果仍然错误,这次 Month = 2 it应该是月 = 3
  • 格式化我的代码是什么意思..?我已经将我的格式化程序更改为 DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aa", Locale.CANADA);
【解决方案3】:

很遗憾,the accepted answerthe other answer 都是错误的。

你在解析中犯了两个错误:

  1. 您已将MMdd 交换。
  2. 您已使用 H 而不是 h 来解析带有 AM/PM 标记的日期时间字符串。符号 H 用于解析 24 小时格式的时间字符串。另一个需要考虑的重点是 PM 在Locale.CANADA 中写为p.m.。对于您的时间字符串,您可以使用 Locale.US 将其指定为 PM。

因此,您可以使用如下所示的解析器:

new SimpleDateFormat("M/d/u h:m:s a", Locale.US)

a 已用于解析 AM/PM。

使用此解析器将解决您的问题,但旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

使用现代日期时间 API 的演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        String convertDate = "03/19/2014 5:30:10 PM";
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("M/d/u h:m:s a", Locale.US);
        LocalDateTime ldt = LocalDateTime.parse(convertDate, dtfInput);
        System.out.printf("Year: %d, Month: %d, Day: %d%n", ldt.getYear(), ldt.getMonthValue(), ldt.getDayOfMonth());

        // Or, using DateTimeFormatter
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("'Year:' uuuu, 'Month:' M, 'Day:' d", Locale.US);
        System.out.println(ldt.format(dtfOutput));
    }
}

输出:

Year: 2014, Month: 3, Day: 19
Year: 2014, Month: 3, Day: 19

Trail: Date Time 了解有关 modern date-time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多