我想要将String
类型的数据以不同的格式转换为Date
类型。
例如,
我从用户那里获取的数据是,
String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format
我想将这个fromDate
转换为一个"yyyy-MM-dd"
格式的日期对象。
我该怎么做?
我想要将String
类型的数据以不同的格式转换为Date
类型。
例如,
我从用户那里获取的数据是,
String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format
我想将这个fromDate
转换为一个"yyyy-MM-dd"
格式的日期对象。
我该怎么做?
可以看一下SimpleDateFormat
。代码大致如下:
SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
e.printStackTrace();
}
parse
而不要继续使用 format
。parse
将字符串解析为日期。 - Michael Myersparse
返回的是日期格式 Fri Jan 06 00:01:00 EST 2012
,但是需要的是 2012-01-06
的日期格式。 - RachelSystem.out.println(anyDateObject)
时,默认的toString()方法被调用,该方法已经被设置为以这种格式打印,例如Fri Jan 06 00:01:00 EST 2012
。您需要重写它以适应您的需求。 - KNULocalDate.parse(
"19/05/2009" ,
DateTimeFormatter.ofPattern( "dd/MM/uuuu" )
)
使用java.util.Date
、java.sql.Date
和SimpleDateFormat
的其他答案现在已经过时。
LocalDate
现代处理日期时间的方式是使用java.time类,特别是LocalDate
。LocalDate
类表示仅包含日期而不包含时间和时区的值。
DateTimeFormatter
要解析或生成表示日期时间值的字符串,请使用DateTimeFormatter
类。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );
LocalDate
)可以生成一个字符串来表示其内部值,但日期时间对象和字符串是分开的不同对象。DateTimeFormatter f =
DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
.withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );
转储到控制台。
System.out.println( "ld: " + ld + " | output: " + output );
ld: 2009年5月19日 | output: 2009年5月19日星期二
java.time 框架是内置于 Java 8 及更高版本的。这些类取代了老旧且令人困扰的 遗留 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
想要了解更多,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,也不需要java.sql.*
类。
如何获取java.time类?
Interval
, YearWeek
, YearQuarter
和更多。使用SimpleDateFormat
类:
private Date parseDate(String date, String format) throws ParseException
{
SimpleDateFormat formatter = new SimpleDateFormat(format);
return formatter.parse(date);
}
用法:
Date date = parseDate("19/05/2009", "dd/MM/yyyy");
为了提高效率,您可以将格式化程序存储在哈希映射中。哈希映射是您的实用程序类的静态成员。
private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();
public static Date parseDate(String date, String format) throws ParseException
{
SimpleDateFormat formatter = hashFormatters.get(format);
if (formatter == null)
{
formatter = new SimpleDateFormat(format);
hashFormatters.put(format, formatter);
}
return formatter.parse(date);
}
将字符串日期转换为java.sql.Date
String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010
虽然SimpleDateFormat
确实可以满足您的需求,但是您可能还想查看Joda Time,它显然是Java 7中重新设计日期库的基础。虽然我没有多次使用过它,但我听到的都是好消息,如果您在项目中广泛处理日期,那么它可能值得一试。
格式化日期并将其转换为字符串的简单方法
Date date= new Date();
String dateStr=String.format("%td/%tm/%tY", date,date,date);
System.out.println("Date with format of dd/mm/dd: "+dateStr);
输出:格式为dd/mm/dd的日期:21/10/2015
String mDate="2019-09-17T10:56:07.827088"
public String getDate() {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
Date date = dateFormat.parse(mDate);
dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
return dateFormat.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
Return
是这个:2019年9月17日
我们有提取时间的方法:
public String getTime() {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
Date date = dateFormat.parse(mCreatedAt);
dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
return dateFormat.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
Return
是这样的: 上午10:56
KOTLIN:
我们有一个提取日期的函数:
fun getDate(): String? {
var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
val date = dateFormat.parse(mDate!!)
dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
return dateFormat.format(date!!)
}
Return
是这样的:09/17/2019
我们有提取时间的方法:
fun getTime(): String {
var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
val time = dateFormat.parse(mDate!!)
dateFormat = SimpleDateFormat("h:mm a", Locale.US)
return dateFormat.format(time!!)
}
Return
是这样的: 上午10:56
10:56 AM
,而是得到了11:09 AM
(在Oracle jdk-11.0.3上测试)。 - Ole V.V.DateTimeFormatter
,我们需要minsdk 26
或更高版本,这并不是好事。 - milad salimi10:56 AM
。 - milad salimiDate
对象没有格式,它是一个表示。可以使用您喜欢的格式通过String
来呈现日期。
例如"yyyy-MM-dd
", "yy-MMM-dd
", "dd-MMM-yy
"等。
要实现这一点,您可以使用SimpleDateFormat
试试这个:
String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format
SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
System.out.println(dateMyFormat); // outputs : 2009-05-19
} catch (ParseException e) {
e.printStackTrace();
}
有多种方法可以做到这一点,但一个非常实用的方法是使用 String.format
,你可以与 java.util.Date
或 java.util.Calendar
或甚至是 java.time.LocalDate
一起使用。
String.format
的支持者是 java.util.Formatter
。
我喜欢对它的万物皆可食的看法。
class Playground {
public static void main(String[ ] args) {
String formatString = "Created on %1$td/%1$tm/%1$tY%n";
System.out.println(String.format(formatString, new java.util.Date()));
System.out.println(String.format(formatString, java.util.Calendar.getInstance()));
System.out.println(String.format(formatString, java.time.LocalDate.now()));
}
}
输出结果将始终如一:
Created on 04/12/2022
Created on 04/12/2022
Created on 04/12/2022
Date
对象作为结果。 - Ole V.V.java.util.Date
对象(请参见上文)。虽然我还包括了其他一些日期类型以突出该方法的实用性,这可能超出了问题的范围,但在更大的视角下,对开发人员来说也是有用的知识。 - gil.fernandesLocalDate
而不是设计不佳的Date
和Calendar
类,所以感谢您包含了它。 - Ole V.V.