Most visited

Recently visited

Added in API level 24

DateIntervalFormat

public class DateIntervalFormat
extends UFormat

java.lang.Object
   ↳ java.text.Format
     ↳ android.icu.text.UFormat
       ↳ android.icu.text.DateIntervalFormat


DateIntervalFormat是一种以语言无关的方式格式化和解析日期间隔的类。 只支持格式。 解析不受支持。

日期间隔是指从一个日期到另一个日期,例如,从“2008年1月11日”到“2008年1月18日”。 我们引入了类DateInterval来表示它。 DateInterval是一对UDate,这是自1970年1月1日格林尼治标准时间24:00以来的标准毫秒数。

DateIntervalFormat将DateInterval格式化为尽可能紧凑的文本。 例如,2008年1月11日至2008年1月18日的英文日期间隔格式为2008年1月11日至18日。 它将文本解析到DateInterval中,尽管最初不支持解析。

日期时间模式中没有结构信息。 对于日期时间模式中的任何标点符号和字符串文字,我们不知道它是否只是分隔符,前缀或后缀。 如果没有这样的信息,那么很难通过算法生成子模式(或超模式)。 所以,格式化DateInterval是由模式驱动的。 它与SimpleDateFormat中的格式非常相似。 我们引入了类DateIntervalInfo来保存日期间隔模式,类似于SimpleDateFormat中的日期时间模式。

逻辑上,间隔模式是从(skeleton,the_largest_different_calendar_field)到(date_interval_pattern)的映射。

骨架

  1. only keeps the field pattern letter and ignores all other parts in a pattern, such as space, punctuations, and string literals.
  2. hides the order of fields.
  3. might hide a field's pattern letter length. For those non-digit calendar fields, the pattern letter length is important, such as MMM, MMMM, and MMMMM; EEE and EEEE, and the field's pattern letter length is honored. For the digit calendar fields, such as M or MM, d or dd, yy or yyyy, the field pattern length is ignored and the best match, which is defined in date time patterns, will be returned without honor the field pattern letter length in skeleton.

我们支持间隔格式的日历字段是:年,月,日,星期,am-pm,小时,每小时,每分钟和秒(尽管我们目前没有特定的骨架的intervalFormat数据与秒)。 可以按以下顺序定义这些日历字段:年>月>日>小时(日)>分>秒日历两个日历之间最大的不同日历字段是上述顺序中的第一个不同的日历字段。 例如:“2007年1月10日”和“2008年2月20日”之间最大的不同日历字段是年份。

对于其他日历字段,紧凑间隔格式不受支持。 间隔格式将回退到回落模式,大部分为“{date0} - {date1}”。

在DateFormat中有一组预定义的静态框架字符串,在区域设置的资源文件中为这些预定义的框架提供了预定义的时间间隔模式。 例如,对于en_US中的“yMMMd”骨架YEAR_ABBR_MONTH_DAY,如果date1和date2之间的最大不同日历字段为“年”,则日期间隔模式为“MMM d,yyyy - MMM d,yyyy”,例如如“2007年1月10日 - 2008年1月10日”。 如果日期1和日期2之间的最大不同日历字段为“月”,则日期间隔格式为“MMM d - MMM d,yyyy”,如“2007年1月10日 - 2007年2月10日”。 如果date1和date2之间的最大不同日历字段为“day”,则日期间隔模式为“MMM dd,yyyy”,如“2007年1月10日-20日”。对于日期骨架,年份或月份或日期不同在资源文件中定义,对于时间骨架,在资源文件中定义am / pm或hour或minute不同的区间模式。

如果在语言环境的DateIntervalInfo中找不到骨架,这意味着骨架的间隔模式未在资源文件中定义,则间隔模式将回退到资源文件中定义的时间间隔“回退”模式。 如果间隔“后退”模式未定义,则默认回退为“{date0} - {data1}”。

对于日期和时间的组合,对共同间隔模式的规则是:

  1. when the year, month, or day differs, falls back to fall-back interval pattern, which mostly is the concatenate the two original expressions with a separator between, For example, interval pattern from "Jan 10, 2007 10:10 am" to "Jan 11, 2007 10:10am" is "Jan 10, 2007 10:10 am - Jan 11, 2007 10:10am"
  2. otherwise, present the date followed by the range expression for the time. For example, interval pattern from "Jan 10, 2007 10:10 am" to "Jan 10, 2007 11:10am" is "Jan 10, 2007 10:10 am - 11:10am"

如果两个日期相同,则间隔模式是单个日期模式。 例如,从“2007年1月10日”到“2007年1月10日”的间隔模式是“2007年1月10日”。 或者如果两个日期之间的呈现字段具有完全相同的值,则间隔模式是单个日期模式。 例如,如果用户仅请求年份和月份,则从“2007年1月10日”到“2007年1月20日”的间隔模式是“2007年1月”。

DateIntervalFormat需要正确格式的以下信息:时区,日历类型,模式,日期格式符号和日期间隔模式。 它可以通过几种方式实例化:

  1. create an instance using default or given locale plus given skeleton. Users are encouraged to created date interval formatter this way and to use the pre-defined skeleton macros, such as YEAR_NUM_MONTH, which consists the calendar fields and the format style.
  2. create an instance using default or given locale plus given skeleton plus a given DateIntervalInfo. This factory method is for powerful users who want to provide their own interval patterns. Locale provides the timezone, calendar, and format symbols information. Local plus skeleton provides full pattern information. DateIntervalInfo provides the date interval patterns.

对于日历字段模式字母,例如G,y,M,d,a,h,H,m,s等。DateIntervalFormat使用与DateTime格式相同的语法。

代码示例:一般用法


   // the date interval object which the DateIntervalFormat formats on
   // and parses into
   DateInterval dtInterval = new DateInterval(1000*3600*24L, 1000*3600*24*2L);
   DateIntervalFormat dtIntervalFmt = DateIntervalFormat.getInstance(
                   YEAR_MONTH_DAY, Locale("en", "GB", ""));
   StringBuffer str = new StringBuffer("");
   FieldPosition pos = new FieldPosition(0);
   // formatting
   dtIntervalFmt.format(dtInterval, dateIntervalString, pos);

 

代码示例:适用于想要使用自己的间隔模式的强大用户


     import android.icu.text.DateIntervalInfo;
     import android.icu.text.DateIntervalFormat;
     ....................
     
     // Get DateIntervalFormat instance using default locale
     DateIntervalFormat dtitvfmt = DateIntervalFormat.getInstance(YEAR_MONTH_DAY);
     
     // Create an empty DateIntervalInfo object, which does not have any interval patterns inside.
     dtitvinf = new DateIntervalInfo();
     
     // a series of set interval patterns.
     // Only ERA, YEAR, MONTH, DATE,  DAY_OF_MONTH, DAY_OF_WEEK, AM_PM,  HOUR, HOUR_OF_DAY,
     MINUTE and SECOND are supported.
     dtitvinf.setIntervalPattern("yMMMd", Calendar.YEAR, "'y ~ y'"); 
     dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "yyyy 'diff' MMM d - MMM d");
     dtitvinf.setIntervalPattern("yMMMd", Calendar.DATE, "yyyy MMM d ~ d");
     dtitvinf.setIntervalPattern("yMMMd", Calendar.HOUR_OF_DAY, "yyyy MMM d HH:mm ~ HH:mm");
     
     // Set fallback interval pattern. Fallback pattern is used when interval pattern is not found.
     // If the fall-back pattern is not set,  falls back to {date0} - {date1} if interval pattern is not found.
     dtitvinf.setFallbackIntervalPattern("{0} - {1}");
     
     // Set above DateIntervalInfo object as the interval patterns of date interval formatter
     dtitvfmt.setDateIntervalInfo(dtitvinf);
     
     // Prepare to format
     pos = new FieldPosition(0);
     str = new StringBuffer("");
     
     // The 2 calendars should be equivalent, otherwise,  IllegalArgumentException will be thrown by format()
     Calendar fromCalendar = (Calendar) dtfmt.getCalendar().clone();
     Calendar toCalendar = (Calendar) dtfmt.getCalendar().clone();
     fromCalendar.setTimeInMillis(....);
     toCalendar.setTimeInMillis(...);
     
     //Formatting given 2 calendars
     dtitvfmt.format(fromCalendar, toCalendar, str, pos);
 

 

Summary

Public methods

Object clone()

以多态方式克隆这个Format对象。

final StringBuffer format(DateInterval dtInterval, StringBuffer appendTo, FieldPosition fieldPosition)

格式化一个DateInterval来产生一个字符串。

final StringBuffer format(Object obj, StringBuffer appendTo, FieldPosition fieldPosition)

格式化对象以生成字符串。

final StringBuffer format(Calendar fromCalendar, Calendar toCalendar, StringBuffer appendTo, FieldPosition pos)

格式2日历生成一个字符串。

DateFormat getDateFormat()

获取日期格式化程序

DateIntervalInfo getDateIntervalInfo()

获取日期时间间隔模式。

static final DateIntervalFormat getInstance(String skeleton)

从骨架和默认的 FORMAT语言环境构造一个DateIntervalFormat。

static final DateIntervalFormat getInstance(String skeleton, Locale locale)

从骨架和给定的语言环境构造一个DateIntervalFormat。

static final DateIntervalFormat getInstance(String skeleton, Locale locale, DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和给定的语言环境构造一个DateIntervalFormat。

static final DateIntervalFormat getInstance(String skeleton, ULocale locale, DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和给定的语言环境构造一个DateIntervalFormat。

static final DateIntervalFormat getInstance(String skeleton, ULocale locale)

从骨架和给定的语言环境构造一个DateIntervalFormat。

static final DateIntervalFormat getInstance(String skeleton, DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和默认的 FORMAT区域设置构造一个DateIntervalFormat。

TimeZone getTimeZone()

获取时区

void setDateIntervalInfo(DateIntervalInfo newItvPattern)

设置日期时间间隔模式。

void setTimeZone(TimeZone zone)

为此DateIntervalFormat对象使用的日历设置TimeZone。

Inherited methods

From class java.text.Format
From class java.lang.Object

Public methods

clone

Added in API level 24
Object clone ()

以多态方式克隆这个Format对象。

Returns
Object A copy of the object.

format

Added in API level 24
StringBuffer format (DateInterval dtInterval, 
                StringBuffer appendTo, 
                FieldPosition fieldPosition)

格式化一个DateInterval来产生一个字符串。

Parameters
dtInterval DateInterval: DateInterval to be formatted.
appendTo StringBuffer: Output parameter to receive result. Result is appended to existing contents.
fieldPosition FieldPosition: On input: an alignment field, if desired. On output: the offsets of the alignment field. There may be multiple instances of a given field type in an interval format; in this case the fieldPosition offsets refer to the first instance.
Returns
StringBuffer Reference to 'appendTo' parameter.

format

Added in API level 24
StringBuffer format (Object obj, 
                StringBuffer appendTo, 
                FieldPosition fieldPosition)

格式化对象以生成字符串。 此方法使用DateInterval类型处理Formattable对象。 如果Formattable对象类型不是DateInterval,则抛出IllegalArgumentException。

Parameters
obj Object: The object to format. Must be a DateInterval.
appendTo StringBuffer: Output parameter to receive result. Result is appended to existing contents.
fieldPosition FieldPosition: On input: an alignment field, if desired. On output: the offsets of the alignment field. There may be multiple instances of a given field type in an interval format; in this case the fieldPosition offsets refer to the first instance.
Returns
StringBuffer Reference to 'appendTo' parameter.
Throws
IllegalArgumentException if the formatted object is not DateInterval object

format

Added in API level 24
StringBuffer format (Calendar fromCalendar, 
                Calendar toCalendar, 
                StringBuffer appendTo, 
                FieldPosition pos)

格式2日历生成一个字符串。

Parameters
fromCalendar Calendar: calendar set to the from date in date interval to be formatted into date interval string
toCalendar Calendar: calendar set to the to date in date interval to be formatted into date interval string
appendTo StringBuffer: Output parameter to receive result. Result is appended to existing contents.
pos FieldPosition: On input: an alignment field, if desired. On output: the offsets of the alignment field. There may be multiple instances of a given field type in an interval format; in this case the fieldPosition offsets refer to the first instance.
Returns
StringBuffer Reference to 'appendTo' parameter.
Throws
IllegalArgumentException if the two calendars are not equivalent.

getDateFormat

Added in API level 24
DateFormat getDateFormat ()

获取日期格式化程序

Returns
DateFormat a copy of the date formatter associated with this date interval formatter.

getDateIntervalInfo

Added in API level 24
DateIntervalInfo getDateIntervalInfo ()

获取日期时间间隔模式。

Returns
DateIntervalInfo a copy of the date time interval patterns associated with this date interval formatter.

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton)

从骨架和默认的FORMAT区域设置构造一个DateIntervalFormat。 这是getInstance(String骨架,ULocale语言环境)的一个方便重写,其语言环境值为默认的FORMAT语言环境。

Parameters
skeleton String: the skeleton on which interval format based.
Returns
DateIntervalFormat a date time interval formatter.

也可以看看:

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton, 
                Locale locale)

从骨架和给定的语言环境构造一个DateIntervalFormat。 这是getInstance(字符串骨架,ULocale语言环境)

示例代码:

final Date date[] = {
        new GregorianCalendar(2007,10,10,10,10,10).getTime(),
        new GregorianCalendar(2008,10,10,10,10,10).getTime(),
        new GregorianCalendar(2008,11,10,10,10,10).getTime(),
        new GregorianCalendar(2008,11,10,15,10,10).getTime(),
};
final DateInterval dtitv[] = {
        new DateInterval(date[0].getTime(),date[1].getTime()),
        new DateInterval(date[1].getTime(),date[2].getTime()),
        new DateInterval(date[2].getTime(),date[3].getTime()),
};
final String [] skeletons = {
        DateFormat.YEAR_ABBR_MONTH_DAY,
        DateFormat.MONTH_DAY,
        DateFormat.HOUR_MINUTE,
        };
System.out.printf("%-15s%-35s%-35s%-35s%-35s\n", "Skeleton", "from","to","Date Interval in en_US", "Date Interval in Ja");
int i=0;
for (String skeleton:skeletons) {
System.out.printf("%-15s%-35s%-35s", skeleton,date[i].toString(), date[i+1].toString());
        DateIntervalFormat dtitvfmtEn = DateIntervalFormat.getInstance(skeleton, ULocale.ENGLISH);
        DateIntervalFormat dtitvfmtJa = DateIntervalFormat.getInstance(skeleton, ULocale.JAPANESE);
        System.out.printf("%-35s%-35s\n", dtitvfmtEn.format(dtitv[i]),dtitvfmtJa.format(dtitv[i]));
        i++;
}
/** output of the sample code:
 *********************************************************************************************************************************************************
 Skeleton       from                               to                                 Date Interval in en_US             Date Interval in Ja
 yMMMd          Sat Nov 10 10:10:10 EST 2007       Mon Nov 10 10:10:10 EST 2008       Nov 10, 2007 – Nov 10, 2008        2007年11月10日~2008年11月10日 
 MMMMd          Mon Nov 10 10:10:10 EST 2008       Wed Dec 10 10:10:10 EST 2008       November 10 – December 10          11月10日~12月10日 
 jm             Wed Dec 10 10:10:10 EST 2008       Wed Dec 10 15:10:10 EST 2008       10:10 AM – 3:10 PM                 10:10~15:10

 *********************************************************************************************************************************************************/

Parameters
skeleton String: the skeleton on which interval format based.
locale Locale: the given locale
Returns
DateIntervalFormat a date time interval formatter.

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton, 
                Locale locale, 
                DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和给定的语言环境构造一个DateIntervalFormat。 这是getInstance(字符串骨架,ULocale语言环境,DateIntervalInfo dtitvinf)

示例代码:

final Date date[] = {
        new GregorianCalendar(2007,9,10,10,10,10).getTime(),
        new GregorianCalendar(2007,10,10,10,10,10).getTime(),
        new GregorianCalendar(2007,10,10,22,10,10).getTime(),
};
final DateInterval dtitv[] = {
        new DateInterval(date[0].getTime(),date[1].getTime()),
        new DateInterval(date[1].getTime(),date[2].getTime()),
};
final String [] skeletons = {
        DateFormat.YEAR_ABBR_MONTH_DAY,
        DateFormat.HOUR24_MINUTE,
        };
System.out.printf("%-15s%-35s%-35s%-45s%-35s\n", "Skeleton", "from","to", "Date Interval in en_US", "Date Interval in Ja");
// Create an empty DateIntervalInfo object
DateIntervalInfo dtitvinf = new DateIntervalInfo(ULocale.ENGLISH);
// Set Date Time internal pattern for MONTH, DAY_OF_MONTH, HOUR_OF_DAY
dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "y 'Diff' MMM d --- MMM d");
dtitvinf.setIntervalPattern("Hm", Calendar.HOUR_OF_DAY, "yyyy MMM d HH:mm ~ HH:mm");
// Set fallback interval pattern
dtitvinf.setFallbackIntervalPattern("{0} ~~~ {1}");
// Get the DateIntervalFormat with the custom pattern
for (String skeleton:skeletons){
    for (int i=0;i<2;i++) {
    System.out.printf("%-15s%-35s%-35s", skeleton,date[i].toString(), date[i+1].toString());
    DateIntervalFormat dtitvfmtEn = DateIntervalFormat.getInstance(skeleton,ULocale.ENGLISH,dtitvinf);
    DateIntervalFormat dtitvfmtJa = DateIntervalFormat.getInstance(skeleton,ULocale.JAPANESE,dtitvinf);
    System.out.printf("%-45s%-35s\n", dtitvfmtEn.format(dtitv[i]),dtitvfmtJa.format(dtitv[i]));
    }
       }
/** output of the sample code:
 *************************************************************************************************************************************************************************
  Skeleton       from                               to                                 Date Interval in en_US                       Date Interval in Ja
  yMMMd          Wed Oct 10 10:10:10 EDT 2007       Sat Nov 10 10:10:10 EST 2007       2007 Diff Oct 10 --- Nov 10                  2007 Diff 10月 10 --- 11月 10
  yMMMd          Sat Nov 10 10:10:10 EST 2007       Sat Nov 10 22:10:10 EST 2007       Nov 10, 2007                                 2007年11月10日
  Hm             Wed Oct 10 10:10:10 EDT 2007       Sat Nov 10 10:10:10 EST 2007       10/10/2007, 10:10 ~~~ 11/10/2007, 10:10      2007/10/10 10:10 ~~~ 2007/11/10 10:10
  Hm             Sat Nov 10 10:10:10 EST 2007       Sat Nov 10 22:10:10 EST 2007       2007 Nov 10 10:10 ~ 22:10                    2007 11月 10 10:10 ~ 22:10
 *************************************************************************************************************************************************************************/

Parameters
skeleton String: the skeleton on which interval format based.
locale Locale: the given locale
dtitvinf DateIntervalInfo: the DateIntervalInfo object to be adopted.
Returns
DateIntervalFormat a date time interval formatter.

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton, 
                ULocale locale, 
                DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和给定的语言环境构造一个DateIntervalFormat。

在这种工厂方法中,用户提供自己的日期间隔模式信息,而不是在资源文件中使用这些预定义的数据。 这种工厂方法适用于想要提供自己的间隔模式的强大用户。

在DateFormat中有预定义的框架,如MONTH_DAY,YEAR_MONTH_WEEKDAY_DAY等。这些框架在资源文件中具有预定义的间隔模式。 鼓励用户使用它们。 例如:DateIntervalFormat.getInstance(DateFormat.MONTH_DAY,false,loc,itvinf); DateIntervalInfo提供了间隔模式。 如果用户希望设置其他间隔模式(而不是从资源文件读取间隔模式),则建议用户在DateIntervalInfo中设置默认间隔模式。 如果未找到最大日历不同字段的相应间隔模式(如果用户未设置它),则间隔格式将回退到默认间隔模式。 如果用户不提供默认间隔模式,则回退到“{date0} - {date1}”

Parameters
skeleton String: the skeleton on which interval format based.
locale ULocale: the given locale
dtitvinf DateIntervalInfo: the DateIntervalInfo object to be adopted.
Returns
DateIntervalFormat a date time interval formatter.

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton, 
                ULocale locale)

从骨架和给定的语言环境构造一个DateIntervalFormat。

在这种工厂方法中,日期间隔模式信息是从资源文件加载的。 鼓励用户以这种方式创建日期间隔格式化程序并使用预定义的骨架宏。

在DateFormat中有预定义的骨架,例如MONTH_DAY,YEAR_MONTH_WEEKDAY_DAY等。这些骨架在资源文件中具有预定义的间隔模式。 鼓励用户使用它们。 例如:DateIntervalFormat.getInstance(DateFormat.MONTH_DAY,false,loc); 给定的区域设置提供了区间模式。 例如,对于en_GB,如果骨架是YEAR_ABBR_MONTH_WEEKDAY_DAY,即“yMMMEEEd”,则资源文件中定义的以上骨架的区间模式为:“EEE,d MMM,yyyy - EEE,d MMM,yyyy”的年份不同,“EEE ,d MMM - EEE,d MMM,yyyy“的月份不同,”EEE,d - EEE,d MMM,yyyy“

Parameters
skeleton String: the skeleton on which interval format based.
locale ULocale: the given locale
Returns
DateIntervalFormat a date time interval formatter.

getInstance

Added in API level 24
DateIntervalFormat getInstance (String skeleton, 
                DateIntervalInfo dtitvinf)

从骨架DateIntervalInfo和默认的FORMAT区域设置构造一个DateIntervalFormat。 这是getInstance(字符串骨架,ULocale语言环境,DateIntervalInfo dtitvinf)的便捷重写,其语言环境值为默认的FORMAT语言环境。

Parameters
skeleton String: the skeleton on which interval format based.
dtitvinf DateIntervalInfo: the DateIntervalInfo object to be adopted.
Returns
DateIntervalFormat a date time interval formatter.

也可以看看:

getTimeZone

Added in API level 24
TimeZone getTimeZone ()

获取时区

Returns
TimeZone A copy of the TimeZone associated with this date interval formatter.

setDateIntervalInfo

Added in API level 24
void setDateIntervalInfo (DateIntervalInfo newItvPattern)

设置日期时间间隔模式。

Parameters
newItvPattern DateIntervalInfo: the given interval patterns to copy.

setTimeZone

Added in API level 24
void setTimeZone (TimeZone zone)

为此DateIntervalFormat对象使用的日历设置TimeZone。

Parameters
zone TimeZone: The new TimeZone, will be cloned for use by this DateIntervalFormat.

Hooray!