Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: base/i18n/time_formatting.cc

Issue 2570253002: [MD History] Fix toolbar dates in grouped mode. (Closed)
Patch Set: use date interval format Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 10 matching lines...) Expand all
164 const icu::Measure measures[] = { 182 const icu::Measure measures[] = {
165 icu::Measure(hours, icu::MeasureUnit::createHour(status), status), 183 icu::Measure(hours, icu::MeasureUnit::createHour(status), status),
166 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status)}; 184 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status)};
167 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status); 185 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status);
168 icu::UnicodeString formatted; 186 icu::UnicodeString formatted;
169 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); 187 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
170 measure_format.formatMeasures(measures, 2, formatted, ignore, status); 188 measure_format.formatMeasures(measures, 2, formatted, ignore, status);
171 return base::string16(formatted.getBuffer(), formatted.length()); 189 return base::string16(formatted.getBuffer(), formatted.length());
172 } 190 }
173 191
192 string16 DateIntervalFormat(const Time& begin_time,
193 const Time& end_time,
194 DateFormat format) {
195 UErrorCode status = U_ZERO_ERROR;
196
197 std::unique_ptr<icu::DateIntervalFormat> formatter(
198 icu::DateIntervalFormat::createInstance(DateFormatToString(format),
199 status));
200
201 icu::FieldPosition pos = 0;
202 UDate start_date = static_cast<UDate>(begin_time.ToDoubleT() * 1000);
203 UDate end_date = static_cast<UDate>(end_time.ToDoubleT() * 1000);
204 icu::DateInterval interval(start_date, end_date);
205 icu::UnicodeString formatted;
206 formatter->format(&interval, formatted, pos, status);
207 return string16(formatted.getBuffer(),
208 static_cast<size_t>(formatted.length()));
209 }
210
174 HourClockType GetHourClockType() { 211 HourClockType GetHourClockType() {
175 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback() 212 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback()
176 // once it becomes public. The short time format can be found at 213 // once it becomes public. The short time format can be found at
177 // "calendar/gregorian/DateTimePatterns/3" in the resources. 214 // "calendar/gregorian/DateTimePatterns/3" in the resources.
178 std::unique_ptr<icu::SimpleDateFormat> formatter( 215 std::unique_ptr<icu::SimpleDateFormat> formatter(
179 static_cast<icu::SimpleDateFormat*>( 216 static_cast<icu::SimpleDateFormat*>(
180 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort))); 217 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort)));
181 // Retrieve the short time format. 218 // Retrieve the short time format.
182 icu::UnicodeString pattern_unicode; 219 icu::UnicodeString pattern_unicode;
183 formatter->toPattern(pattern_unicode); 220 formatter->toPattern(pattern_unicode);
(...skipping 21 matching lines...) Expand all
205 // See http://userguide.icu-project.org/formatparse/datetime for details 242 // See http://userguide.icu-project.org/formatparse/datetime for details
206 // about the date/time format syntax. 243 // about the date/time format syntax.
207 if (pattern_unicode.indexOf('a') == -1) { 244 if (pattern_unicode.indexOf('a') == -1) {
208 return k24HourClock; 245 return k24HourClock;
209 } else { 246 } else {
210 return k12HourClock; 247 return k12HourClock;
211 } 248 }
212 } 249 }
213 250
214 } // namespace base 251 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698