47 import java.text.DecimalFormat; |
47 import java.text.DecimalFormat; |
48 import java.text.DecimalFormatSymbols; |
48 import java.text.DecimalFormatSymbols; |
49 import java.text.NumberFormat; |
49 import java.text.NumberFormat; |
50 import java.util.regex.Matcher; |
50 import java.util.regex.Matcher; |
51 import java.util.regex.Pattern; |
51 import java.util.regex.Pattern; |
|
52 import java.util.Objects; |
52 |
53 |
53 import java.time.DateTimeException; |
54 import java.time.DateTimeException; |
54 import java.time.Instant; |
55 import java.time.Instant; |
55 import java.time.ZoneId; |
56 import java.time.ZoneId; |
56 import java.time.ZoneOffset; |
57 import java.time.ZoneOffset; |
3858 if (l != null && l != Locale.US) { |
3859 if (l != null && l != Locale.US) { |
3859 DateFormatSymbols dfs = DateFormatSymbols.getInstance(l); |
3860 DateFormatSymbols dfs = DateFormatSymbols.getInstance(l); |
3860 ampm = dfs.getAmPmStrings(); |
3861 ampm = dfs.getAmPmStrings(); |
3861 } |
3862 } |
3862 String s = ampm[t.get(Calendar.AM_PM)]; |
3863 String s = ampm[t.get(Calendar.AM_PM)]; |
3863 sb.append(s.toLowerCase(l != null ? l : Locale.US)); |
3864 sb.append(s.toLowerCase(Objects.requireNonNullElse(l, Locale.US))); |
3864 break; |
3865 break; |
3865 } |
3866 } |
3866 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?) |
3867 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?) |
3867 long i = t.getTimeInMillis() / 1000; |
3868 long i = t.getTimeInMillis() / 1000; |
3868 Flags flags = Flags.NONE; |
3869 Flags flags = Flags.NONE; |
3891 } |
3892 } |
3892 case DateTime.ZONE: { // 'Z' (symbol) |
3893 case DateTime.ZONE: { // 'Z' (symbol) |
3893 TimeZone tz = t.getTimeZone(); |
3894 TimeZone tz = t.getTimeZone(); |
3894 sb.append(tz.getDisplayName((t.get(Calendar.DST_OFFSET) != 0), |
3895 sb.append(tz.getDisplayName((t.get(Calendar.DST_OFFSET) != 0), |
3895 TimeZone.SHORT, |
3896 TimeZone.SHORT, |
3896 (l == null) ? Locale.US : l)); |
3897 Objects.requireNonNullElse(l, Locale.US))); |
3897 break; |
3898 break; |
3898 } |
3899 } |
3899 |
3900 |
3900 // Date |
3901 // Date |
3901 case DateTime.NAME_OF_DAY_ABBREV: // 'a' |
3902 case DateTime.NAME_OF_DAY_ABBREV: // 'a' |
3902 case DateTime.NAME_OF_DAY: { // 'A' |
3903 case DateTime.NAME_OF_DAY: { // 'A' |
3903 int i = t.get(Calendar.DAY_OF_WEEK); |
3904 int i = t.get(Calendar.DAY_OF_WEEK); |
3904 Locale lt = ((l == null) ? Locale.US : l); |
3905 Locale lt = Objects.requireNonNullElse(l, Locale.US); |
3905 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
3906 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
3906 if (c == DateTime.NAME_OF_DAY) |
3907 if (c == DateTime.NAME_OF_DAY) |
3907 sb.append(dfs.getWeekdays()[i]); |
3908 sb.append(dfs.getWeekdays()[i]); |
3908 else |
3909 else |
3909 sb.append(dfs.getShortWeekdays()[i]); |
3910 sb.append(dfs.getShortWeekdays()[i]); |
3911 } |
3912 } |
3912 case DateTime.NAME_OF_MONTH_ABBREV: // 'b' |
3913 case DateTime.NAME_OF_MONTH_ABBREV: // 'b' |
3913 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b |
3914 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b |
3914 case DateTime.NAME_OF_MONTH: { // 'B' |
3915 case DateTime.NAME_OF_MONTH: { // 'B' |
3915 int i = t.get(Calendar.MONTH); |
3916 int i = t.get(Calendar.MONTH); |
3916 Locale lt = ((l == null) ? Locale.US : l); |
3917 Locale lt = Objects.requireNonNullElse(l, Locale.US); |
3917 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
3918 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
3918 if (c == DateTime.NAME_OF_MONTH) |
3919 if (c == DateTime.NAME_OF_MONTH) |
3919 sb.append(dfs.getMonths()[i]); |
3920 sb.append(dfs.getMonths()[i]); |
3920 else |
3921 else |
3921 sb.append(dfs.getShortMonths()[i]); |
3922 sb.append(dfs.getShortMonths()[i]); |
3982 print(sb, t, DateTime.SECOND, l).append(' '); |
3983 print(sb, t, DateTime.SECOND, l).append(' '); |
3983 // this may be in wrong place for some locales |
3984 // this may be in wrong place for some locales |
3984 StringBuilder tsb = new StringBuilder(); |
3985 StringBuilder tsb = new StringBuilder(); |
3985 print(tsb, t, DateTime.AM_PM, l); |
3986 print(tsb, t, DateTime.AM_PM, l); |
3986 |
3987 |
3987 sb.append(tsb.toString().toUpperCase(l != null ? l : Locale.US)); |
3988 sb.append(tsb.toString().toUpperCase(Objects.requireNonNullElse(l, Locale.US))); |
3988 break; |
3989 break; |
3989 } |
3990 } |
3990 case DateTime.DATE_TIME: { // 'c' (Sat Nov 04 12:02:33 EST 1999) |
3991 case DateTime.DATE_TIME: { // 'c' (Sat Nov 04 12:02:33 EST 1999) |
3991 char sep = ' '; |
3992 char sep = ' '; |
3992 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep); |
3993 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep); |
4090 if (l != null && l != Locale.US) { |
4091 if (l != null && l != Locale.US) { |
4091 DateFormatSymbols dfs = DateFormatSymbols.getInstance(l); |
4092 DateFormatSymbols dfs = DateFormatSymbols.getInstance(l); |
4092 ampm = dfs.getAmPmStrings(); |
4093 ampm = dfs.getAmPmStrings(); |
4093 } |
4094 } |
4094 String s = ampm[t.get(ChronoField.AMPM_OF_DAY)]; |
4095 String s = ampm[t.get(ChronoField.AMPM_OF_DAY)]; |
4095 sb.append(s.toLowerCase(l != null ? l : Locale.US)); |
4096 sb.append(s.toLowerCase(Objects.requireNonNullElse(l, Locale.US))); |
4096 break; |
4097 break; |
4097 } |
4098 } |
4098 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?) |
4099 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?) |
4099 long i = t.getLong(ChronoField.INSTANT_SECONDS); |
4100 long i = t.getLong(ChronoField.INSTANT_SECONDS); |
4100 Flags flags = Flags.NONE; |
4101 Flags flags = Flags.NONE; |
4129 t.isSupported(ChronoField.INSTANT_SECONDS)) { |
4130 t.isSupported(ChronoField.INSTANT_SECONDS)) { |
4130 Instant instant = Instant.from(t); |
4131 Instant instant = Instant.from(t); |
4131 sb.append(TimeZone.getTimeZone(zid.getId()) |
4132 sb.append(TimeZone.getTimeZone(zid.getId()) |
4132 .getDisplayName(zid.getRules().isDaylightSavings(instant), |
4133 .getDisplayName(zid.getRules().isDaylightSavings(instant), |
4133 TimeZone.SHORT, |
4134 TimeZone.SHORT, |
4134 (l == null) ? Locale.US : l)); |
4135 Objects.requireNonNullElse(l, Locale.US))); |
4135 break; |
4136 break; |
4136 } |
4137 } |
4137 sb.append(zid.getId()); |
4138 sb.append(zid.getId()); |
4138 break; |
4139 break; |
4139 } |
4140 } |
4140 // Date |
4141 // Date |
4141 case DateTime.NAME_OF_DAY_ABBREV: // 'a' |
4142 case DateTime.NAME_OF_DAY_ABBREV: // 'a' |
4142 case DateTime.NAME_OF_DAY: { // 'A' |
4143 case DateTime.NAME_OF_DAY: { // 'A' |
4143 int i = t.get(ChronoField.DAY_OF_WEEK) % 7 + 1; |
4144 int i = t.get(ChronoField.DAY_OF_WEEK) % 7 + 1; |
4144 Locale lt = ((l == null) ? Locale.US : l); |
4145 Locale lt = Objects.requireNonNullElse(l, Locale.US); |
4145 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
4146 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
4146 if (c == DateTime.NAME_OF_DAY) |
4147 if (c == DateTime.NAME_OF_DAY) |
4147 sb.append(dfs.getWeekdays()[i]); |
4148 sb.append(dfs.getWeekdays()[i]); |
4148 else |
4149 else |
4149 sb.append(dfs.getShortWeekdays()[i]); |
4150 sb.append(dfs.getShortWeekdays()[i]); |
4151 } |
4152 } |
4152 case DateTime.NAME_OF_MONTH_ABBREV: // 'b' |
4153 case DateTime.NAME_OF_MONTH_ABBREV: // 'b' |
4153 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b |
4154 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b |
4154 case DateTime.NAME_OF_MONTH: { // 'B' |
4155 case DateTime.NAME_OF_MONTH: { // 'B' |
4155 int i = t.get(ChronoField.MONTH_OF_YEAR) - 1; |
4156 int i = t.get(ChronoField.MONTH_OF_YEAR) - 1; |
4156 Locale lt = ((l == null) ? Locale.US : l); |
4157 Locale lt = Objects.requireNonNullElse(l, Locale.US); |
4157 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
4158 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt); |
4158 if (c == DateTime.NAME_OF_MONTH) |
4159 if (c == DateTime.NAME_OF_MONTH) |
4159 sb.append(dfs.getMonths()[i]); |
4160 sb.append(dfs.getMonths()[i]); |
4160 else |
4161 else |
4161 sb.append(dfs.getShortMonths()[i]); |
4162 sb.append(dfs.getShortMonths()[i]); |
4221 print(sb, t, DateTime.MINUTE, l).append(sep); |
4222 print(sb, t, DateTime.MINUTE, l).append(sep); |
4222 print(sb, t, DateTime.SECOND, l).append(' '); |
4223 print(sb, t, DateTime.SECOND, l).append(' '); |
4223 // this may be in wrong place for some locales |
4224 // this may be in wrong place for some locales |
4224 StringBuilder tsb = new StringBuilder(); |
4225 StringBuilder tsb = new StringBuilder(); |
4225 print(tsb, t, DateTime.AM_PM, l); |
4226 print(tsb, t, DateTime.AM_PM, l); |
4226 sb.append(tsb.toString().toUpperCase(l != null ? l : Locale.US)); |
4227 sb.append(tsb.toString().toUpperCase(Objects.requireNonNullElse(l, Locale.US))); |
4227 break; |
4228 break; |
4228 } |
4229 } |
4229 case DateTime.DATE_TIME: { // 'c' (Sat Nov 04 12:02:33 EST 1999) |
4230 case DateTime.DATE_TIME: { // 'c' (Sat Nov 04 12:02:33 EST 1999) |
4230 char sep = ' '; |
4231 char sep = ' '; |
4231 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep); |
4232 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep); |