Module  java.base
软件包  java.text

Class SimpleDateFormat

  • All Implemented Interfaces:
    SerializableCloneable


    public class SimpleDateFormat
    extends DateFormat
    SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。 它允许格式化(日期文本),解析(文本日期)和规范化。

    SimpleDateFormat允许您从选择日期时间格式化的任何用户定义的模式开始。 不过,建议您创建一个日期-时间格式有两种getTimeInstancegetDateInstance ,或getDateTimeInstanceDateFormat 这些类方法中的每一个都可以返回使用默认格式模式初始化的日期/时间格式化程序。 您可以根据需要使用applyPattern方法修改格式模式。 有关使用这些方法的更多信息,请参阅DateFormat

    日期和时间模式

    日期和时间格式由日期和时间模式字符串指定。 在日期和时间模式字符串中,从'A''Z'以及从'a''z'引号的字母被解释为表示日期或时间字符串的组件的模式字母。 可以使用单引号( ' )引用文本,以避免解释。 "''"代表单引号。 所有其他字符不被解释; 在格式化过程中,它们只是复制到输出字符串中,或者在解析过程中与输入字符串匹配。

    定义了以下图案字母(所有其他字符从'A''Z'和从'a''z'被保留):

    Chart shows pattern letters, date/time component, presentation, and examples.
    Letter Date or Time Component Presentation Examples
    G Era designator Text AD
    y Year Year 1996; 96
    Y Week year Year 2009; 09
    M Month in year (context sensitive) Month July; Jul; 07
    L Month in year (standalone form) Month July; Jul; 07
    w Week in year Number 27
    W Week in month Number 2
    D Day in year Number 189
    d Day in month Number 10
    F Day of week in month Number 2
    E Day name in week Text Tuesday; Tue
    u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
    a Am/pm marker Text PM
    H Hour in day (0-23) Number 0
    k Hour in day (1-24) Number 24
    K Hour in am/pm (0-11) Number 0
    h Hour in am/pm (1-12) Number 12
    m Minute in hour Number 30
    s Second in minute Number 55
    S Millisecond Number 978
    z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
    Z Time zone RFC 822 time zone -0800
    X Time zone ISO 8601 time zone -08; -0800; -08:00
    模式字母通常重复,因为它们的数字确定了准确的表示:
    • Text:对于格式化,如果模式字母数为4以上,则使用完整形式; 否则,如果有的话,使用简短或缩写形式。 对于解析,两种形式都是接受的,与模式字母的数量无关。

    • Number:对于格式化,模式字母的数量是最小位数,较短的数字被填充到该数量。 对于解析,模式字母的数量将被忽略,除非需要分隔两个相邻的字段。

    • Year:如果格式化程序的Calendar是公历,则应用以下规则。
      • 对于格式化,如果模式字母数为2,那么年份将被截断为2位数; 否则解释为number
      • 对于解析,如果模式字母的数量大于2,则年份将按字面解释,而不管数字的数量。 所以使用模式“MM / dd / yyyy”,“01/11/12”解析为公元12年1月11日
      • 要使用缩写年份模式(“y”或“yy”)进行解析, SimpleDateFormat必须解释相对于某个世纪的缩写年份。 这样做是通过将日期调整为在创建SimpleDateFormat实例之后的80年之前和20年之后。 例如,使用1997年1月1日创建的“MM / dd / yy”和SimpleDateFormat实例的模式,字符串“01/11/12”将被解释为2012年1月11日,而字符串“05/04 / 64“将被解释为1964年5月4日。在解析期间,只有由Character.isDigit(char)定义的两个数字组成的字符串将被解析为默认世纪。 任何其他数字字符串,例如一位数字字符串,三位或三位以上数字字符串,或两位数字字符串(全部不是全部数字)(例如“-1”),均按字面解释。 所以“01/02/3”或“01/02/003”的解析方式与公元3年1月2日相同。 同样,“01/02 / -3”在公元前4年1月2日被解析。
      否则,将应用日历系统特定的表单。 对于格式化和解析两者,如果模式字母数为4以上,则使用特定日历long form的日历。 否则,使用特定日历的日历short or abbreviated form

      如果本周年'Y'了规定,并且calendar不支持任何week years ,历年( 'y' )来代替。 可以通过致电getCalendar()测试一周的支持。 isWeekDateSupported()

    • Month:如果模式字母数为3以上,则该月份被解释为text ; 否则,它被解释为number
      • 字母M产生上下文相关的月份名称,例如嵌入的名称形式。 字母M是上下文敏感的,因为当它在独立模式中使用时,例如“MMMM”,它给出了一个月份名称的独立形式,并且当它在包含其他字段的模式中使用时,例如,“d MMMM”,它给出了一个月份名称的格式。 例如,加泰罗尼亚语的1月是格式形式的“de gener”,而它们是独立形式的“gener”。 在这种情况下,“MMMM”会产生“一般”,“d MMMM”的月份将产生“通用”。 如果已经使用构造函数SimpleDateFormat(String,DateFormatSymbols)或方法setDateFormatSymbols(DateFormatSymbols)明确设置了一个DateFormatSymbols ,则使用由DateFormatSymbols给出的月份名称。
      • L字母生成独立形式的月份名称。

    • General time zone:如果他们有姓名,时区将被解释为text 对于表示GMT偏移值的时区,使用以下语法:
        GMTOffsetTimeZone:
                   GMT Sign Hours : Minutes
           Sign: one of
                   + -
           Hours:
                   Digit
                   Digit Digit
           Minutes:
                   Digit Digit
           Digit: one of
                   0 1 2 3 4 5 6 7 8 9 
      小时数必须在0到23之间, 分钟必须介于00和59之间。格式与区域设置无关,数字必须取自Unicode标准的基本拉丁方块。

      对于解析, RFC 822 time zones也被接受。

    • RFC 822 time zone:格式化时,使用RFC 822 4位数时区格式:
        RFC822TimeZone:
                   Sign TwoDigitHours Minutes
           TwoDigitHours:
                   Digit Digit 
      TwoDigitHours必须介于00和23之间。其他定义与general time zones相同

      对于解析, general time zones也被接受。

    • ISO 8601 Time zone:模式字母的数量指定格式和解析的格式如下:
        ISO8601TimeZone:
                   OneLetterISO8601TimeZone
                   TwoLetterISO8601TimeZone
                   ThreeLetterISO8601TimeZone
           OneLetterISO8601TimeZone:
                   Sign TwoDigitHours
                   Z
           TwoLetterISO8601TimeZone:
                   Sign TwoDigitHours Minutes
                   Z
           ThreeLetterISO8601TimeZone:
                   Sign TwoDigitHours : Minutes
                   Z 
      其他定义与general time zonesRFC 822 time zones相同

      对于格式化,如果GMT的偏移值为0,则产生"Z" 如果模式字母的数量为1,则忽略小时数。 例如,如果模式是"X" ,而时区是"GMT+05:30" ,则产生"+05"

      对于解析, "Z"被解析为UTC时区指示符。 General time zones 被接受。

      如果模式字母的数目是4或更多, IllegalArgumentException被构建时抛出SimpleDateFormatapplying a pattern

    SimpleDateFormat还支持本地化的日期和时间模式字符串。 在这些字符串中,上述的图案字母可以被替换为其他与区域相关的图案字母。 SimpleDateFormat不处理除了图案字母之外的文本的本地化; 这取决于课堂的客户。

    例子

    以下示例显示如何在美国地区中解释日期和时间模式。 给定的日期和时间是2001-07-04 12:08:56当地时间在美国太平洋时间时区。
    Examples of date and time patterns interpreted in the U.S. locale
    Date and Time Pattern Result
    "yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
    "EEE, MMM d, ''yy" Wed, Jul 4, '01
    "h:mm a" 12:08 PM
    "hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
    "K:mm a, z" 0:08 PM, PDT
    "yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
    "EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
    "yyMMddHHmmssZ" 010704120856-0700
    "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
    "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
    "YYYY-'W'ww-u" 2001-W27-3

    Synchronization

    日期格式不同步。 建议为每个线程创建单独的格式实例。 如果多个线程同时访问格式,则必须在外部进行同步。

    从以下版本开始:
    1.1
    另请参见:
    Java TutorialCalendarTimeZoneDateFormatDateFormatSymbolsSerialized Form
    • 构造方法详细信息

      • SimpleDateFormat

        public SimpleDateFormat​()
        构造一个SimpleDateFormat使用默认模式和日期格式符号进行默认的FORMAT语言环境。 注意:此构造函数可能不支持所有区域设置。 要全面覆盖,请使用DateFormat类中的工厂方法。
      • SimpleDateFormat

        public SimpleDateFormat​(String pattern,
                                Locale locale)
        构造一个SimpleDateFormat使用给定的模式和给定语言环境的默认日期格式符号。 注意:此构造函数可能不支持所有区域设置。 要完整覆盖,请使用DateFormat类中的工厂方法。
        参数
        pattern - 描述日期和时间格式的模式
        locale - 应使用日期格式符号的区域设置
        异常
        NullPointerException - 如果给定的模式或区域设置为空
        IllegalArgumentException - 如果给定的模式无效
      • SimpleDateFormat

        public SimpleDateFormat​(String pattern,
                                DateFormatSymbols formatSymbols)
        使用给定的模式和日期格式符号构造一个 SimpleDateFormat
        参数
        pattern - 描述日期和时间格式的模式
        formatSymbols - 要用于格式化的日期格式符号
        异常
        NullPointerException - 如果给定的模式或formatSymbols为空
        IllegalArgumentException - 如果给定的模式无效
    • 方法详细信息

      • set2DigitYearStart

        public void set2DigitYearStart​(Date startDate)
        设置100年期间,两位数年份将被解释为在用户指定的日期开始。
        参数
        startDate - 在解析期间,两位数年份将放置在 startDatestartDate + 100 years的范围内。
        异常
        NullPointerException - 如果 startDatenull
        从以下版本开始:
        1.2
        另请参见:
        get2DigitYearStart()
      • get2DigitYearStart

        public Date get2DigitYearStart​()
        返回100年期间的开始日期,2位数年份被解释为在内。
        结果
        开始解读两位数年的100年期间
        从以下版本开始:
        1.2
        另请参见:
        set2DigitYearStart(java.util.Date)
      • format

        public StringBuffer format​(Date date,
                                   StringBuffer toAppendTo,
                                   FieldPosition pos)
        将给定的 Date成日期/时间字符串,并将结果追加到给定的 StringBuffer
        Specified by:
        formatDateFormat
        参数
        date - 要格式化为日期时间字符串的日期时间值。
        toAppendTo - 要附加新的日期时间文本。
        pos - 格式化位置。 在输入:对齐字段,如果需要。 输出:对齐字段的偏移量。
        结果
        格式化的日期时间字符串。
        异常
        NullPointerException - 如果任何参数是 null
      • formatToCharacterIterator

        public AttributedCharacterIterator formatToCharacterIterator​(Object obj)
        格式化一个对象,生成一个AttributedCharacterIterator 您可以使用返回的AttributedCharacterIterator构建生成的String,以及确定有关生成的String的信息。

        AttributedCharacterIterator的每个属性键将是类型为DateFormat.Field ,对应的属性值与属性键相同。

        重写:
        formatToCharacterIteratorFormat
        参数
        obj - 要格式化的对象
        结果
        AttributedCharacterIterator描述格式化的值。
        异常
        NullPointerException - 如果obj为空。
        IllegalArgumentException - 如果格式不能格式化给定的对象,或格式的模式字符串无效。
        从以下版本开始:
        1.4
      • parse

        public Date parse​(String text,
                          ParsePosition pos)
        从字符串中解析文本,产生一个Date

        该方法尝试从pos给出的索引开始解析文本。 如果解析成功,则pos的索引将更新为使用最后一个字符后的索引(解析不一定使用字符串末尾的所有字符),并返回解析的日期。 更新的pos可用于指示下一次调用此方法的起始点。 如果发生错误,则pos的索引不改变,则将错误索引pos设置为发生错误的字符的索引,返回null。

        此解析操作使用calendar生成Date 所有的calendar的日期时间字段cleared解析之前,与calendar “被用于任何丢失的日期时间信息S日期时间字段的默认值。 例如,如果解析操作没有给出年值,则解析的Date的年值为1970,为GregorianCalendar TimeZone值可能会被覆盖,这取决于给定的模式和时区值在text 以前通过调用setTimeZone设置的任何TimeZone值都可能需要恢复进一步操作。

        Specified by:
        parseDateFormat
        参数
        text - A String ,其中一部分应该被解析。
        pos - 具有上述索引和错误索引信息的 ParsePosition对象。
        结果
        A Date从字符串中解析。 万一出错,返回null。
        异常
        NullPointerException - 如果 textpos为空。
      • toPattern

        public String toPattern​()
        返回描述此日期格式的模式字符串。
        结果
        描述此日期格式的模式字符串。
      • toLocalizedPattern

        public String toLocalizedPattern​()
        返回描述此日期格式的本地化模式字符串。
        结果
        描述此日期格式的本地化模式字符串。
      • applyPattern

        public void applyPattern​(String pattern)
        将给定的模式字符串应用于此日期格式。
        参数
        pattern - 此日期格式的新日期和时间模式
        异常
        NullPointerException - 如果给定的模式为空
        IllegalArgumentException - 如果给定的模式无效
      • applyLocalizedPattern

        public void applyLocalizedPattern​(String pattern)
        将给定的本地化模式字符串应用于此日期格式。
        参数
        pattern - 要映射到此格式的新日期和时间格式模式的字符串
        异常
        NullPointerException - 如果给定的模式为空
        IllegalArgumentException - 如果给定的模式无效
      • setDateFormatSymbols

        public void setDateFormatSymbols​(DateFormatSymbols newFormatSymbols)
        设置此日期格式的日期和时间格式符号。
        参数
        newFormatSymbols - 新的日期和时间格式符号
        异常
        NullPointerException - 如果给定的newFormatSymbols为空
        另请参见:
        getDateFormatSymbols()
      • clone

        public Object clone​()
        创建一个这个SimpleDateFormat的副本。 这也克隆了格式的日期格式符号。
        重写:
        cloneDateFormat
        结果
        这个 SimpleDateFormat的克隆
        另请参见:
        Cloneable
      • equals

        public boolean equals​(Object obj)
        将给定对象与此 SimpleDateFormat进行比较以获得相等性。
        重写:
        equalsDateFormat
        参数
        obj - 与之比较的参考对象。
        结果
        如果给定的对象等于这个 SimpleDateFormat
        另请参见:
        Object.hashCode()HashMap