12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/date_time_formatter.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDateTimeChooserParams.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/smpdtfmt.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DateTimeFormatter::CreatePatternMap() { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize all the UI elements with empty patterns, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then fill in the ones that are actually date/time inputs and 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are implemented. 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0 ; i <= ui::TEXT_INPUT_TYPE_MAX; ++i) { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[i] = ""; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[ui::TEXT_INPUT_TYPE_DATE] = "yyyy-MM-dd"; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[ui::TEXT_INPUT_TYPE_DATE_TIME] = "yyyy-MM-dd'T'HH:mm'Z'"; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL] = "yyyy-MM-dd'T'HH:mm"; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[ui::TEXT_INPUT_TYPE_MONTH] = "yyyy-MM"; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns_[ui::TEXT_INPUT_TYPE_TIME] = "HH:mm"; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch patterns_[ui::TEXT_INPUT_TYPE_WEEK] = "Y-'W'ww"; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DateTimeFormatter::DateTimeFormatter( 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebDateTimeChooserParams& source) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : formatted_string_(source.currentValue.utf8()) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreatePatternMap(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtractType(source); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ParseValues()) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_NONE; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearAll(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Problems parsing input <" << formatted_string_ << ">"; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DateTimeFormatter::DateTimeFormatter( 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TextInputType type, 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int year, int month, int day, int hour, int minute, int second, 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int week_year, int week) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : type_(type), 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) year_(year), 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) month_(month), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) day_(day), 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hour_(hour), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) minute_(minute), 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch second_(second), 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_year_(week_year), 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_(week) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreatePatternMap(); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pattern_ = type_ > 0 && type_ <= ui::TEXT_INPUT_TYPE_MAX ? 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &patterns_[type_] : &patterns_[ui::TEXT_INPUT_TYPE_NONE]; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatted_string_ = FormatString(); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DateTimeFormatter::~DateTimeFormatter() { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetYear() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return year_; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetMonth() const { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return month_; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetDay() const { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return day_; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetHour() const { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return hour_; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetMinute() const { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return minute_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::GetSecond() const { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return second_; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint DateTimeFormatter::GetWeekYear() const { 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return week_year_; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint DateTimeFormatter::GetWeek() const { 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return week_; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::TextInputType DateTimeFormatter::GetType() const { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string& DateTimeFormatter::GetFormattedValue() const { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return formatted_string_; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string DateTimeFormatter::FormatString() const { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UErrorCode success = U_ZERO_ERROR; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (year_ == 0 && month_ == 0 && day_ == 0 && 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hour_ == 0 && minute_ == 0 && second_ == 0 && 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_year_ == 0 && week_ == 0) { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch icu::GregorianCalendar calendar(success); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (success <= U_ZERO_ERROR) { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type_ == ui::TEXT_INPUT_TYPE_WEEK) { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // An ISO week starts with Monday. 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.setFirstDayOfWeek(UCAL_MONDAY); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // ISO 8601 defines that the week with the year's first Thursday is the 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // first week. 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.setMinimalDaysInFirstWeek(4); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_YEAR_WOY, week_year_); 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_WEEK_OF_YEAR, week_); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_YEAR, year_); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_MONTH, month_); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_DATE, day_); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_HOUR_OF_DAY, hour_); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_MINUTE, minute_); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch calendar.set(UCAL_SECOND, second_); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icu::SimpleDateFormat formatter(*pattern_, success); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icu::UnicodeString formatted_time; 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch formatter.format(calendar, formatted_time, NULL, success); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UTF16ToUTF8(formatted_time.getBuffer(), 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<size_t>(formatted_time.length()), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &result); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (success <= U_ZERO_ERROR) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Calendar not created: error " << success; 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DateTimeFormatter::ExtractType( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebDateTimeChooserParams& source) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (source.type) { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeDate: 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_DATE; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeDateTime: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_DATE_TIME; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeDateTimeLocal: 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeMonth: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_MONTH; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeTime: 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_TIME; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case WebKit::WebDateTimeInputTypeWeek: 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type_ = ui::TEXT_INPUT_TYPE_WEEK; 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebKit::WebDateTimeInputTypeNone: 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = ui::TEXT_INPUT_TYPE_NONE; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Not all fields are defined in all configurations and ICU might store 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// garbage if success <= U_ZERO_ERROR so the output is sanitized here. 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int DateTimeFormatter::ExtractValue( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const icu::Calendar* calendar, UCalendarDateFields value) const { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UErrorCode success = U_ZERO_ERROR; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = calendar->get(value, success); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (success <= U_ZERO_ERROR) ? result : 0; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DateTimeFormatter::ParseValues() { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ui::TEXT_INPUT_TYPE_NONE) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearAll(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (formatted_string_.empty()) { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearAll(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UErrorCode success = U_ZERO_ERROR; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icu::UnicodeString icu_value = icu::UnicodeString::fromUTF8( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icu::StringPiece(formatted_string_.data(), formatted_string_.size())); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ > 0 && type_ <= ui::TEXT_INPUT_TYPE_MAX) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const icu::UnicodeString pattern = patterns_[type_]; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icu::SimpleDateFormat formatter(pattern, success); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) formatter.parse(icu_value, success); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (success <= U_ZERO_ERROR) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const icu::Calendar* cal = formatter.getCalendar(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) year_ = ExtractValue(cal, UCAL_YEAR); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) month_ = ExtractValue(cal, UCAL_MONTH); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) day_ = ExtractValue(cal, UCAL_DATE); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hour_ = ExtractValue(cal, UCAL_HOUR_OF_DAY); // 24h format 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) minute_ = ExtractValue(cal, UCAL_MINUTE); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_ = ExtractValue(cal, UCAL_SECOND); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_year_ = ExtractValue(cal, UCAL_YEAR_WOY); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_ = ExtractValue(cal, UCAL_WEEK_OF_YEAR); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (success <= U_ZERO_ERROR); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DateTimeFormatter::ClearAll() { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) year_ = 0; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) month_ = 0; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) day_ = 0; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hour_ = 0; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) minute_ = 0; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_ = 0; 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_year_ = 0; 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch week_ = 0; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 228