簡體   English   中英

使用日歷從 DateFormat 解析日期時輸出錯誤

[英]Wrong output in parsing Date from DateFormat Using Calendar

我的代碼有什么問題我無法從我想要解析的日期時間獲得確切的輸出?

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

從此更改您的日期格式

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));
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();
        }

不幸的是,接受的答案以及其他答案都是錯誤的。

你在解析時犯了兩個錯誤:

  1. 您已將MMdd交換。
  2. 您已使用H而不是h來解析帶有 AM/PM 標記的日期時間字符串。 符號H用於解析 24 小時格式的時間字符串。 另一個需要考慮的重要一點是,PM寫成pmLocale.CANADA 對於您的時間字符串,您可以使用Locale.US其指定為 PM。

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

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

其中a已用於解析 AM/PM。

使用此解析器將解決您的問題,但舊的日期時間 API( java.util日期時間類型及其格式化 API, SimpleDateFormat )已過時且容易出錯。 建議完全停止使用它並切換到java.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 中了解有關現代日期時間 API * 的更多信息。


* 出於任何原因,如果您必須堅持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它將大部分java.time功能向后移植到 Java 6 和 7。如果您正在為 Android 項目和您的 Android API 工作級別仍然不符合 Java-8,請檢查 通過 desugaringHow to use ThreeTenABP in Android Project 可用的 Java 8+ APIs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM