我使用Joda Time并需要以用户首选格式显示日期(note that before Android M, the format could be changed)。
Joda DateTime可以使用DateTimeFormatter格式化,DateTimeFormatter是从具有所需日期格式的String创建的:
public String getFormattedDate(String datePattern) {
if (mDate != null) {
// get your local timezone
DateTimeZone localTZ = DateTimeZone.getDefault();
DateTime dt = mDate.toDateTime(localTZ);
DateTimeFormatter fmt = DateTimeFormat.forPattern(datePattern);
String formattedDate = dt.toString(fmt);
return formattedDate;
}
return "";
}
但要获得用户的首选格式,您必须使用Java DateFormat:
public static DateFormat getPreferredDateFormat(Context context) {
final String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
DateFormat dateFormat;
if (android.text.TextUtils.isEmpty(format)) {
dateFormat = android.text.format.DateFormat.getMediumDateFormat(context.getApplicationContext());
} else {
dateFormat = android.text.format.DateFormat.getDateFormat(context.getApplicationContext()); // Gets system date format
}
if (dateFormat == null)
dateFormat = new SimpleDateFormat(format);
return dateFormat;
}
并且Java DateFormat没有一个方法可以给我一个带有日期格式的字符串。
那么有没有办法用Java DateFormat格式化Joda DateTime?也许还指定我只想显示日期和月份(将是dd / MM或MM / dd)?或者使DateTimeFormatter采用用户的首选格式?
答案 0 :(得分:3)
DateFormat是一个抽象类,因此没有格式模式的访问方法(因为每个具体实现都将处理自己的模式)。 但是,android.text.format.DateFormat.getDateFormat()返回的内容实际上是SimpleDateFormat,它提供了模式。因此,您可以执行以下操作:
SimpleDateFormat format=(SimpleDateFormat)DateFormat.getDateFormat(context.getApplicationContext());
String pattern=format.toPattern();
或
String pattern=format.toLocalizedPattern();
这暂时适用,但请注意,它不是100%的未来证明,因为getDateFormat()返回的实际类可能在将来发生变化。
答案 1 :(得分:1)
Joda-Time项目现在处于维护模式。团队建议转到java.time班。
生成表示日期时间值的String时,DateTimeFormatter
类可以自动进行本地化。
Instant instant = Instant.now(); // Current moment in UTC with a resolution of up to nanoseconds.
ZoneId z = ZoneId.of( "America/Montreal" ); // Specify a time zone.
ZonedDateTime zdt = instant.atZone( z ); // Adjust from UTC to a specific time zone. Same moment, different wall-clock time.
要进行本地化,请指定:
FormatStyle
确定字符串是否为long或缩写。Locale
确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。< / LI>
示例:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
如果您只想使用月份和日期,MonthDay
课程就是这样。
MonthDay md = MonthDay.from( zdt );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。
答案 2 :(得分:0)
{
"size": 0,
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "doc['dateTime'].value.dayOfWeek",
"lang": "painless"
}
}
}
}
}, <-- note the curly brackets
"aggs": {
"total_order_per_hour_per_day": {
"date_histogram": {
"field": "dateTime",
"calendar_interval": "hour"
}
}
}
}