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