使用首选DateFormat格式化JodaTime DateTime

时间:2016-09-02 20:40:51

标签: java android datetime jodatime date-formatting

我使用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采用用户的首选格式?

3 个答案:

答案 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)

java.time

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

答案 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"
      }
    }
  }
}