OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/i18n/time_formatting.h" | 5 #include "base/i18n/time_formatting.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "third_party/icu/source/i18n/unicode/datefmt.h" | 14 #include "third_party/icu/source/i18n/unicode/datefmt.h" |
| 15 #include "third_party/icu/source/i18n/unicode/dtitvfmt.h" |
15 #include "third_party/icu/source/i18n/unicode/dtptngen.h" | 16 #include "third_party/icu/source/i18n/unicode/dtptngen.h" |
16 #include "third_party/icu/source/i18n/unicode/fmtable.h" | 17 #include "third_party/icu/source/i18n/unicode/fmtable.h" |
17 #include "third_party/icu/source/i18n/unicode/measfmt.h" | 18 #include "third_party/icu/source/i18n/unicode/measfmt.h" |
18 #include "third_party/icu/source/i18n/unicode/smpdtfmt.h" | 19 #include "third_party/icu/source/i18n/unicode/smpdtfmt.h" |
19 | 20 |
20 namespace base { | 21 namespace base { |
21 namespace { | 22 namespace { |
22 | 23 |
23 string16 TimeFormat(const icu::DateFormat* formatter, | 24 string16 TimeFormat(const icu::DateFormat* formatter, |
24 const Time& time) { | 25 const Time& time) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 switch (width) { | 75 switch (width) { |
75 case DURATION_WIDTH_WIDE: return UMEASFMT_WIDTH_WIDE; | 76 case DURATION_WIDTH_WIDE: return UMEASFMT_WIDTH_WIDE; |
76 case DURATION_WIDTH_SHORT: return UMEASFMT_WIDTH_SHORT; | 77 case DURATION_WIDTH_SHORT: return UMEASFMT_WIDTH_SHORT; |
77 case DURATION_WIDTH_NARROW: return UMEASFMT_WIDTH_NARROW; | 78 case DURATION_WIDTH_NARROW: return UMEASFMT_WIDTH_NARROW; |
78 case DURATION_WIDTH_NUMERIC: return UMEASFMT_WIDTH_NUMERIC; | 79 case DURATION_WIDTH_NUMERIC: return UMEASFMT_WIDTH_NUMERIC; |
79 } | 80 } |
80 NOTREACHED(); | 81 NOTREACHED(); |
81 return UMEASFMT_WIDTH_COUNT; | 82 return UMEASFMT_WIDTH_COUNT; |
82 } | 83 } |
83 | 84 |
| 85 const char* DateFormatToString(DateFormat format) { |
| 86 switch (format) { |
| 87 case DATE_FORMAT_YEAR_MONTH: |
| 88 return UDAT_YEAR_MONTH; |
| 89 case DATE_FORMAT_MONTH_WEEKDAY_DAY: |
| 90 return UDAT_MONTH_WEEKDAY_DAY; |
| 91 } |
| 92 NOTREACHED(); |
| 93 return UDAT_YEAR_MONTH_DAY; |
| 94 } |
| 95 |
84 } // namespace | 96 } // namespace |
85 | 97 |
86 string16 TimeFormatTimeOfDay(const Time& time) { | 98 string16 TimeFormatTimeOfDay(const Time& time) { |
87 // We can omit the locale parameter because the default should match | 99 // We can omit the locale parameter because the default should match |
88 // Chrome's application locale. | 100 // Chrome's application locale. |
89 std::unique_ptr<icu::DateFormat> formatter( | 101 std::unique_ptr<icu::DateFormat> formatter( |
90 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort)); | 102 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort)); |
91 return TimeFormat(formatter.get(), time); | 103 return TimeFormat(formatter.get(), time); |
92 } | 104 } |
93 | 105 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 return TimeFormat(formatter.get(), time); | 146 return TimeFormat(formatter.get(), time); |
135 } | 147 } |
136 | 148 |
137 string16 TimeFormatShortDateAndTimeWithTimeZone(const Time& time) { | 149 string16 TimeFormatShortDateAndTimeWithTimeZone(const Time& time) { |
138 std::unique_ptr<icu::DateFormat> formatter( | 150 std::unique_ptr<icu::DateFormat> formatter( |
139 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kShort, | 151 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kShort, |
140 icu::DateFormat::kLong)); | 152 icu::DateFormat::kLong)); |
141 return TimeFormat(formatter.get(), time); | 153 return TimeFormat(formatter.get(), time); |
142 } | 154 } |
143 | 155 |
| 156 string16 TimeFormatMonthAndYear(const Time& time) { |
| 157 icu::SimpleDateFormat formatter = |
| 158 CreateSimpleDateFormatter(DateFormatToString(DATE_FORMAT_YEAR_MONTH)); |
| 159 return TimeFormat(&formatter, time); |
| 160 } |
| 161 |
144 string16 TimeFormatFriendlyDateAndTime(const Time& time) { | 162 string16 TimeFormatFriendlyDateAndTime(const Time& time) { |
145 std::unique_ptr<icu::DateFormat> formatter( | 163 std::unique_ptr<icu::DateFormat> formatter( |
146 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kFull)); | 164 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kFull)); |
147 return TimeFormat(formatter.get(), time); | 165 return TimeFormat(formatter.get(), time); |
148 } | 166 } |
149 | 167 |
150 string16 TimeFormatFriendlyDate(const Time& time) { | 168 string16 TimeFormatFriendlyDate(const Time& time) { |
151 std::unique_ptr<icu::DateFormat> formatter( | 169 std::unique_ptr<icu::DateFormat> formatter( |
152 icu::DateFormat::createDateInstance(icu::DateFormat::kFull)); | 170 icu::DateFormat::createDateInstance(icu::DateFormat::kFull)); |
153 return TimeFormat(formatter.get(), time); | 171 return TimeFormat(formatter.get(), time); |
(...skipping 30 matching lines...) Expand all Loading... |
184 icu::Measure(hours, icu::MeasureUnit::createHour(status), status), | 202 icu::Measure(hours, icu::MeasureUnit::createHour(status), status), |
185 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status), | 203 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status), |
186 icu::Measure(seconds, icu::MeasureUnit::createSecond(status), status)}; | 204 icu::Measure(seconds, icu::MeasureUnit::createSecond(status), status)}; |
187 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status); | 205 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status); |
188 icu::UnicodeString formatted; | 206 icu::UnicodeString formatted; |
189 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); | 207 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); |
190 measure_format.formatMeasures(measures, 3, formatted, ignore, status); | 208 measure_format.formatMeasures(measures, 3, formatted, ignore, status); |
191 return base::string16(formatted.getBuffer(), formatted.length()); | 209 return base::string16(formatted.getBuffer(), formatted.length()); |
192 } | 210 } |
193 | 211 |
| 212 string16 DateIntervalFormat(const Time& begin_time, |
| 213 const Time& end_time, |
| 214 DateFormat format) { |
| 215 UErrorCode status = U_ZERO_ERROR; |
| 216 |
| 217 std::unique_ptr<icu::DateIntervalFormat> formatter( |
| 218 icu::DateIntervalFormat::createInstance(DateFormatToString(format), |
| 219 status)); |
| 220 |
| 221 icu::FieldPosition pos = 0; |
| 222 UDate start_date = static_cast<UDate>(begin_time.ToDoubleT() * 1000); |
| 223 UDate end_date = static_cast<UDate>(end_time.ToDoubleT() * 1000); |
| 224 icu::DateInterval interval(start_date, end_date); |
| 225 icu::UnicodeString formatted; |
| 226 formatter->format(&interval, formatted, pos, status); |
| 227 return string16(formatted.getBuffer(), |
| 228 static_cast<size_t>(formatted.length())); |
| 229 } |
| 230 |
194 HourClockType GetHourClockType() { | 231 HourClockType GetHourClockType() { |
195 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback() | 232 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback() |
196 // once it becomes public. The short time format can be found at | 233 // once it becomes public. The short time format can be found at |
197 // "calendar/gregorian/DateTimePatterns/3" in the resources. | 234 // "calendar/gregorian/DateTimePatterns/3" in the resources. |
198 std::unique_ptr<icu::SimpleDateFormat> formatter( | 235 std::unique_ptr<icu::SimpleDateFormat> formatter( |
199 static_cast<icu::SimpleDateFormat*>( | 236 static_cast<icu::SimpleDateFormat*>( |
200 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort))); | 237 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort))); |
201 // Retrieve the short time format. | 238 // Retrieve the short time format. |
202 icu::UnicodeString pattern_unicode; | 239 icu::UnicodeString pattern_unicode; |
203 formatter->toPattern(pattern_unicode); | 240 formatter->toPattern(pattern_unicode); |
(...skipping 21 matching lines...) Expand all Loading... |
225 // See http://userguide.icu-project.org/formatparse/datetime for details | 262 // See http://userguide.icu-project.org/formatparse/datetime for details |
226 // about the date/time format syntax. | 263 // about the date/time format syntax. |
227 if (pattern_unicode.indexOf('a') == -1) { | 264 if (pattern_unicode.indexOf('a') == -1) { |
228 return k24HourClock; | 265 return k24HourClock; |
229 } else { | 266 } else { |
230 return k12HourClock; | 267 return k12HourClock; |
231 } | 268 } |
232 } | 269 } |
233 | 270 |
234 } // namespace base | 271 } // namespace base |
OLD | NEW |