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)的映射。
骨架
我们支持间隔格式的日历字段是:年,月,日,星期,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}”。
对于日期和时间的组合,对共同间隔模式的规则是:
如果两个日期相同,则间隔模式是单个日期模式。 例如,从“2007年1月10日”到“2007年1月10日”的间隔模式是“2007年1月10日”。 或者如果两个日期之间的呈现字段具有完全相同的值,则间隔模式是单个日期模式。 例如,如果用户仅请求年份和月份,则从“2007年1月10日”到“2007年1月20日”的间隔模式是“2007年1月”。
DateIntervalFormat需要正确格式的以下信息:时区,日历类型,模式,日期格式符号和日期间隔模式。 它可以通过几种方式实例化:
对于日历字段模式字母,例如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);
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) 从骨架和默认的 |
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和默认的 |
TimeZone |
getTimeZone() 获取时区 |
void |
setDateIntervalInfo(DateIntervalInfo newItvPattern) 设置日期时间间隔模式。 |
void |
setTimeZone(TimeZone zone) 为此DateIntervalFormat对象使用的日历设置TimeZone。 |
Inherited methods |
|
---|---|
From class java.text.Format
|
|
From class java.lang.Object
|
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. |
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 |
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. |
DateFormat getDateFormat ()
获取日期格式化程序
Returns | |
---|---|
DateFormat |
a copy of the date formatter associated with this date interval formatter. |
DateIntervalInfo getDateIntervalInfo ()
获取日期时间间隔模式。
Returns | |
---|---|
DateIntervalInfo |
a copy of the date time interval patterns associated with this date interval formatter. |
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. |
也可以看看:
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. |
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. |
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. |
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. |
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. |
也可以看看:
TimeZone getTimeZone ()
获取时区
Returns | |
---|---|
TimeZone |
A copy of the TimeZone associated with this date interval formatter. |
void setDateIntervalInfo (DateIntervalInfo newItvPattern)
设置日期时间间隔模式。
Parameters | |
---|---|
newItvPattern |
DateIntervalInfo : the given interval patterns to copy. |
void setTimeZone (TimeZone zone)
为此DateIntervalFormat对象使用的日历设置TimeZone。
Parameters | |
---|---|
zone |
TimeZone : The new TimeZone, will be cloned for use by this DateIntervalFormat. |