【发布时间】:2010-09-29 13:43:46
【问题描述】:
我想读取格式为 YYYY-MM-DD 的日期。
但如果我输入日期,例如 2008-1-1,我想将其读取为 2008-01-01。
有人可以帮我吗?提前致谢
【问题讨论】:
标签: java date formatting
我想读取格式为 YYYY-MM-DD 的日期。
但如果我输入日期,例如 2008-1-1,我想将其读取为 2008-01-01。
有人可以帮我吗?提前致谢
【问题讨论】:
标签: java date formatting
【讨论】:
如果您需要使用内置的 Java 日期/时间处理,Adeel 的解决方案很好,但我个人更愿意使用 Joda Time。在格式化方面,Joda Time 的主要好处是格式化程序是无状态的,因此您可以在线程之间安全地共享它。示例代码:
DateTimeFormatter parser = DateTimeFormat.forPattern("YYYY-M-D");
DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-DD");
DateTime dt = parser.parseDateTime("2008-1-1");
String formatted = formatter.print(dt); // "2008-01-01"
【讨论】:
或者使用更好的Joda Time lib。
DateTime dt = new DateTime();
System.out.println(dt.toString("yyyy-MM-dd"));
// The ISO standard format for date is 'yyyy-MM-dd'
DateTimeFormatter formatter = ISODateTimeFormat.date();
System.out.println(dt.toString(formatter));
System.out.println(formatter.print(dt));
日期和日历 API 很糟糕。
【讨论】:
import java.text.*;
public class Test
{
public static void main(String args[])
{
try
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
System.out.println(sdf.parse(args[0]).toString());
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
无论您写为参数“2008-1-1”还是“2008-01-01”,这都能正常工作。
【讨论】:
java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
另外,下面引用的是来自home page of Joda-Time的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用现代日期时间 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) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d", Locale.ENGLISH);
String input = "2008-1-1";
LocalDate date = LocalDate.parse(input, dtfInput);
System.out.println(date);
}
}
输出:
2008-01-01
注意事项:
y(指定年份)而不是Y(指定基于周的年份)。d(指定月日)代替D(指定年日)。u 可以同时满足两位数和四位数字的年份表示。同样,单个M 可以同时满足一位数和两位数的月份。 DateTimeFormatter 以类似的方式处理其他字母。y 代替u 但I prefer u to y。DateTimeFormatter 作为输出字符串。这是因为LocalDate#toString 已经返回ISO-8601 格式的字符串,uuuu-MM-dd(这也是您想要的模式)。从 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。
【讨论】: