【问题标题】:Android DatePicker and Java's DateAndroid DatePicker 和 Java 的 Date
【发布时间】:2012-01-17 18:43:09
【问题描述】:
我被这里描述的问题所困扰:Android DatePicker year problem。简而言之,Android 的 DatePicker 期望以年为单位指定年份(2011 是 2011),而 Java 的 Date 类从 1900 开始(所以 2011 实际上是 111)。
除了在转换时添加和减去 1900 之外,还有更好的方法来混合 Date 和 DatePickers 吗?
意大利。
【问题讨论】:
-
这是从不使用糟糕的遗留类Date、Calendar、SimpleDateFormat 等的众多原因之一。仅使用 java.time 类。查看Answer by Avinash 中的现代解决方案。
标签:
java
android
date
datepicker
【解决方案1】:
是的 - 不要使用 Date 中已弃用的方法来处理日/月/年值。 Date 仅代表时间的瞬间 - 如果您想将其转换为适当的人为分解为天、月、年等,您应该使用 Calendar - 并应用时区。
【解决方案2】:
java.time
java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
使用现代日期时间 API java.time 的解决方案:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int dpYear = 2010, dpMonth = 1, dpDayOfMonth = 15;
// In DatePicker, the month is indexed starting at 0. Check
// https://stackoverflow.com/a/4467894/10819573 to learn more.
dpMonth++;
LocalDate date = LocalDate.of(dpYear, dpMonth, dpDayOfMonth);
System.out.println(date);
// Formatted output
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMMM dd uuuu", Locale.ENGLISH);
String formatted = dtf.format(date);
System.out.println(formatted);
}
}
输出:
2010-02-15
Mon February 15 2010
ONLINE DEMO
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。