【问题标题】:Date from EditText来自 EditText 的日期
【发布时间】:2013-07-14 12:02:59
【问题描述】:

我尝试从 Android 中的 edittext 获取日期,但代码返回错误的文本。

Java 代码:

SimpleDateFormat df = new SimpleDateFormat("dd-MM-YYYY"); 
java.util.Date myDate;
myDate = df.parse(editText1.getText().toString());
String myText = myDate.getDay() + "-" + myDate.getMonth() + "-" + myDate.getYear() + "abcd";

XML 代码:

<EditText
                android:id="@+id/editText1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:inputType="date">

当我在 EditText 中写入文本“23-08-2013”​​时,代码返回“5-7-113-abcd”。怎么了?如何从 EditText 获得正确的日期?

【问题讨论】:

    标签: android date datetime time android-edittext


    【解决方案1】:

    getDay() 返回星期几,所以这是错误的。使用getDate()

    getMonth() 从零开始,所以你需要给它加 1。

    getYear() 返回一个值,该值是年份减去 1900 的结果,因此您需要在其中加上 1900。

    abcd - 好吧,你明确地将它添加到字符串的末尾,所以这并不奇怪:)

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); 
    Date myDate;
    try {
        myDate = df.parse(date);
        String myText = myDate.getDate() + "-" + (myDate.getMonth() + 1) + "-" + (1900 + myDate.getYear());
        Log.i(TAG, myText);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    所有这些都已弃用,您应该真正使用Calendar

    编辑:Calendar的快速示例

    Calendar cal = Calendar.getInstance();
    cal.setTime(myDate);
    cal.get(Calendar.DAY_OF_MONTH); // and so on
    

    【讨论】:

    • 谢谢 :) 我如何使用 Calenda 来做到这一点?我试图从日历实例中获取日期,但结果是错误的。
    • 好吧,我不太确定您要做什么,因为在您的示例中,您似乎只是转换为日期,只是为了转换回完全相同的字符串。使用日历进行涉及日期的计算。无论如何,希望对您有所帮助。
    【解决方案2】:

    请不要害怕查看 Java 文档。这些方法已弃用。 (顺便说一句,您使用错误的方法获取值) 使用日历:

    Calendar c = Calendar.getInstance();
    c.setTime(myDate)
    String dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
    String month = c.get(Calendar.MONTH);
    String year = c.get(Calendar.YEAR);
    

    【讨论】:

    • 您不能直接构造日历。请改用 Calendar.getInstance()。
    【解决方案3】:

    Android 文档始终是最佳参考。 这是日历文档页面的链接:

    http://developer.android.com/reference/java/util/Calendar.html

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    【解决方案4】:

    java.time 通过脱糖或 ThreeTenABP

    我建议您将现代 Java 日期和时间 API java.time 用于您的日期工作。

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        String textFromEditText = "23-08-2013";
        LocalDate myDate = LocalDate.parse(textFromEditText, dateFormatter);
        String myText = myDate.format(dateFormatter);
        System.out.println("Formatted again: " + myText);
    

    输出是:

    再次格式化:23-08-2013

    正如您使用格式化程序将字符串解析为LocalDate 一样,在格式化其他方式时也使用格式化程序,从LocalDateString。如果你想再次使用相同的格式,只需再次使用相同的格式化程序。

    你的代码出了什么问题?

    Date 类设计不佳且经常令人困惑。关于自 Java 1.1(1997 年 2 月)以来已弃用的方法的令人困惑的行为,Ken Wolf 的回答是正确的。

    您的代码中还有一个问题,即在格式模式字符串中使用大写的YYYY。大写的YYYY 是基于周的年份,仅对周数有用。小写 yyyy 表示时代。事实上,由于这个错误,我从您的代码中得到了1-11-112abcd,这仍然比您报告的结果更远。这三个数字都不正确。

    问题:java.time 不需要 Android API 26 级吗?

    java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
    • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2010-12-29
      • 2018-10-21
      • 1970-01-01
      • 2012-03-04
      • 2020-02-10
      相关资源
      最近更新 更多