我是这样的:
2015-09-18 12:24:16
我需要这个:
18 settembre (localized month string)
我试过这种方式:
private String formatDate(String dateString) {
String formattedDate = "";
Date date;
final SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
try {
date = sdf.parse(dateString);
sdf.applyPattern("dd MMMM");
formattedDate = sdf.format(date);
} catch (ParseException pe) {
pe.printStackTrace();
}
return formattedDate;
}
此代码有任何陷阱吗?可以简化吗? Locale.getDefault将始终获得正确的翻译?为什么applyPattern doc说:
"将此简单日期格式的模式更改为使用非本地化模式字符的指定模式。
答案 0 :(得分:3)
std::string funcString = getFromDatabase (...) // Not really, but this is abstract
afunc::functions.at(funcString)(...) // at because the map is const, so it's even threadsafe
<强>输出:强>
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = parser.parse("2015-09-18 12:24:16");
SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",new Locale ("it"));
System.out.println(parser1.format(d1));
答案 1 :(得分:0)
对于默认语言环境使用:locale.getDefault()。
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = null;
try {
d1 = parser.parse("2015-09-18 12:24:16");
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",Locale.getDefault());
System.out.println(parser1.format(d1));
答案 2 :(得分:0)
你可以试试这个: -
Calendar calendar = Calendar.getInstance();
Date currDate = Util.getCurrentDate();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String date = formatter.format(calendar.getTime());
答案 3 :(得分:0)
是的,我看到两个主要问题。
避免使用旧的java.util.Date/.Calendar类。这是众所周知的混乱,麻烦和有缺陷。而是使用成功的Joda-Time库。在Java 8及更高版本中,使用了受Joda-Time启发的新内置java.time框架。
如果精确度很重要,请应用时区。日期因您在地球上的位置而异。例如,巴黎的新一天比蒙特利尔早起。
理想情况下,您的输入字符串将包括从UTC和/或时区的偏移量。如果没有,您必须知道该区域。告诉解析器要使用的区域。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
根据ISO 8601,您的字符串几乎采用标准格式。默认情况下,Joda-Time使用这些标准格式。因此,如果我们用T
替换中间的空格,则无需定义格式模式。
String input = "2015-09-18 12:24:16";
String inputStandard = input.replace( " " , "T" );
DateTime dateTime = new DateTime( inputStandard , zone );
要获得所需的字符串输出,请为所需的人类语言指定Locale
。
Locale locale = Locale.CANADA_FRENCH;
如果您想要JVM的当前默认值Locale
,我建议您调用它来使您的代码自我记录和显式。
Locale locale = Locale.getDefault();
但请记住,当前默认值可随时通过JVM中任何应用程序中任何线程中的任何代码调用setDefault
而发生变化。我建议指定Locale
而不是依赖默认值。
按formatter定义specifying a pattern。告诉格式化程序使用特定的Locale
而不是JVM's current default。
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d MMMM" );
formatter = formatter.withLocale( locale );
String output = formatter.print( dateTime );
转储到控制台。
System.out.println( "input: " + input + " in zone: " + zone + " is: " + dateTime );
System.out.println( "In locale: " + locale + " = " + output );
跑步时。
input: 2015-09-18 12:24:16 in zone: America/Toronto is: 2015-09-18T12:24:16.000-04:00
In locale: fr_CA = 18 septembre
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。