将字符串转换为日期,然后格式化日期
Posted
技术标签:
【中文标题】将字符串转换为日期,然后格式化日期【英文标题】:Convert string to date then format the date 【发布时间】:2011-12-14 11:38:55 【问题描述】:我正在使用代码将字符串格式化为日期
String start_dt = '2011-01-01';
DateFormat formatter = new SimpleDateFormat("YYYY-MM-DD");
Date date = (Date)formatter.parse(start_dt);
但是如何将日期从YYYY-MM-DD
格式转换为MM-DD-YYYY
格式?
【问题讨论】:
仅供参考,麻烦的旧日期时间类,如java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。
【参考方案1】:
使用SimpleDateFormat#format(Date):
String start_dt = "2011-01-01";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-DD");
Date date = (Date)formatter.parse(start_dt);
SimpleDateFormat newFormat = new SimpleDateFormat("MM-dd-yyyy");
String finalString = newFormat.format(date);
【讨论】:
将 'YYYY-MM-DD' 更改为 'yyyy-MM-DD'。 YYYY 无效 DateFormat 格式化程序 = new SimpleDateFormat("yyyy-MM-DD"); //错误 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); //正确 虽然正确,但此答案现已过时。旧的日期时间类(例如java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
)现在是 legacy,被 java.time 类所取代。见Tutorial by Oracle。【参考方案2】:
测试了这段代码
java.text.DateFormat formatter = new java.text.SimpleDateFormat("MM-dd-yyyy");
java.util.Date newDate = new java.util.Date();
System.out.println(formatter.format(newDate ));
http://download.oracle.com/javase/1,5.0/docs/api/java/text/SimpleDateFormat.html
【讨论】:
【参考方案3】:String start_dt = "2011-01-31";
DateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
Date date = (Date) parser.parse(start_dt);
DateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
System.out.println(formatter.format(date));
打印:2011 年 1 月 31 日
【讨论】:
【参考方案4】:一行:
String date=new SimpleDateFormat("MM-dd-yyyy").format(new SimpleDateFormat("yyyy-MM-dd").parse("2011-01-01"));
地点:
String date=new SimpleDateFormat("FinalFormat").format(new SimpleDateFormat("InitialFormat").parse("StringDate"));
【讨论】:
【参考方案5】:String myFormat= "yyyy-MM-dd";
String finalString = "";
try
DateFormat formatter = new SimpleDateFormat("yyyy MMM dd");
Date date = (Date) formatter .parse("2015 Oct 09");
SimpleDateFormat newFormat = new SimpleDateFormat(myFormat);
finalString= newFormat .format(date );
newDate.setText(finalString);
catch (Exception e)
【讨论】:
【参考方案6】:tl;博士
LocalDate.parse( "2011-01-01" )
.format( DateTimeFormatter.ofPattern( "MM-dd-uuuu" ) )
java.time
其他答案现已过时。麻烦的旧日期时间类,例如 java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
,现在是 legacy,被 java.time 类所取代。
ISO 8601
输入字符串 2011-01-01
恰好符合日期时间文本的 ISO 8601 标准格式。 java.time 类在解析/生成字符串时默认使用这些标准格式。所以不需要指定格式模式。
LocalDate
LocalDate
类表示没有时间和时区的仅日期值。
LocalDate ld = LocalDate.parse( "2011-01-01" ) ;
通过调用toString
生成相同格式的字符串。
String output = ld.toString() ;
2011-01-01
DateTimeFormatter
要解析/生成其他格式,请使用DateTimeFormatter
。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" ) ;
String output = ld.format( f ) ;
01-01-2011
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
Java SE 8、Java SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6 和 Java SE 7 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门针对 android 改编了 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…。ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
别忘了 LocalDate 需要 Android O (API 26) 版本才能工作......在这种情况下可以考虑旧版答案。 @lukecross 不正确。重读我的答案末尾的项目符号。此外,Gradle 插件 4 现在通过称为 API 脱糖 的过程为早期 Android 提供了 java.time 功能的子集。所以不需要使用糟糕的遗留日期时间类。 库是第三方库,Android开发官方还不支持,API Desugaring需要迁移,developer.android.com/studio/write/java8-support。我不知道所有用户的哪个版本。可以是1.7也可以是1.8,在1.7的情况下,legacy都可以用,主要用于小转换之类的简单情况。【参考方案7】: String start_dt = "2011-01-01"; // Input String
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); // Existing Pattern
Date getStartDt = formatter.parse(start_dt); //Returns Date Format according to existing pattern
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy");// New Pattern
String formattedDate = simpleDateFormat.format(getStartDt); // Format given String to new pattern
System.out.println(formattedDate); //outputs: 01-01-2011
【讨论】:
【参考方案8】:目前,我更喜欢使用这种方法:
String data = "Date from Register: ";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
// Verify that OS.Version is > API 26 (OREO)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// Origin format
LocalDate localDate = LocalDate.parse(capitalModels.get(position).getDataServer(), formatter); // Parse String (from server) to LocalDate
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd/MM/yyyy");
//Output format
data = "Data de Registro: "+formatter1.format(localDate); // Output
Toast.makeText(holder.itemView.getContext(), data, Toast.LENGTH_LONG).show();
else
//Same resolutions, just use legacy methods to oldest android OS versions.
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd",Locale.getDefault());
try
Date date = format.parse(capitalModels.get(position).getDataServer());
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
data = "Date from Register: "+formatter.format(date);
catch (ParseException e)
e.printStackTrace();
【讨论】:
以上是关于将字符串转换为日期,然后格式化日期的主要内容,如果未能解决你的问题,请参考以下文章