Fix "this hour" and "this minute" in RelativeTimeFormat

Upstream bug: https://unicode-org.atlassian.net/browse/ICU-20654
Upstream PR: https://github.com/unicode-org/icu/pull/674
Test: test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js
 (changed by https://github.com/tc39/test262/pull/2191)

Bug: v8:9327
Change-Id: Ib80f7d1554594f25a625f31f6e7755ee48b9758c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/deps/icu/+/1670016
Reviewed-by: Jungshik Shin <jshin@chromium.org>
diff --git a/README.chromium b/README.chromium
index 5250aee..93dc468 100644
--- a/README.chromium
+++ b/README.chromium
@@ -272,3 +272,10 @@
     https://unicode-org.atlassian.net/browse/ICU-20641
   - upstream PR:
     https://github.com/unicode-org/icu/pull/663
+
+11. Fix RelativeTimeFormat for "this hour" and "this minute"
+  - patches/this_hour_minute.patch
+  - upstream bug:
+    https://unicode-org.atlassian.net/browse/ICU-20654
+  - upstream PR:
+    https://github.com/unicode-org/icu/pull/674
diff --git a/patches/this_hour_minute.patch b/patches/this_hour_minute.patch
new file mode 100644
index 0000000..6c17e26
--- /dev/null
+++ b/patches/this_hour_minute.patch
@@ -0,0 +1,56 @@
+diff --git a/source/i18n/reldatefmt.cpp b/source/i18n/reldatefmt.cpp
+index a7520d31..15d5e99c 100644
+--- a/source/i18n/reldatefmt.cpp
++++ b/source/i18n/reldatefmt.cpp
+@@ -315,6 +315,10 @@ struct RelDateTimeFmtDataSink : public ResourceSink {
+                 return UDAT_ABSOLUTE_FRIDAY;
+             case SATURDAY:
+                 return UDAT_ABSOLUTE_SATURDAY;
++            case HOUR:
++                return UDAT_ABSOLUTE_HOUR;
++            case MINUTE:
++                return UDAT_ABSOLUTE_MINUTE;
+             default:
+                 return -1;
+         }
+@@ -1157,6 +1161,8 @@ void RelativeDateTimeFormatter::formatRelativeImpl(
+         case UDAT_REL_UNIT_THURSDAY:  absunit = UDAT_ABSOLUTE_THURSDAY; break;
+         case UDAT_REL_UNIT_FRIDAY:  absunit = UDAT_ABSOLUTE_FRIDAY; break;
+         case UDAT_REL_UNIT_SATURDAY:  absunit = UDAT_ABSOLUTE_SATURDAY; break;
++        case UDAT_REL_UNIT_HOUR:  absunit = UDAT_ABSOLUTE_HOUR; break;
++        case UDAT_REL_UNIT_MINUTE:  absunit = UDAT_ABSOLUTE_MINUTE; break;
+         default: break;
+     }
+     if (direction != UDAT_DIRECTION_COUNT && absunit != UDAT_ABSOLUTE_UNIT_COUNT) {
+diff --git a/source/i18n/unicode/reldatefmt.h b/source/i18n/unicode/reldatefmt.h
+index 16ae91ad..1533ac6c 100644
+--- a/source/i18n/unicode/reldatefmt.h
++++ b/source/i18n/unicode/reldatefmt.h
+@@ -172,6 +172,18 @@ typedef enum UDateAbsoluteUnit {
+      * @draft ICU 63
+      */
+     UDAT_ABSOLUTE_QUARTER,
++
++    /**
++     * Hour
++     * @draft ICU 65
++     */
++    UDAT_ABSOLUTE_HOUR,
++
++    /**
++     * Minute
++     * @draft ICU 65
++     */
++    UDAT_ABSOLUTE_MINUTE,
+ #endif // U_HIDE_DRAFT_API
+ 
+ #ifndef U_HIDE_DEPRECATED_API
+@@ -179,7 +191,7 @@ typedef enum UDateAbsoluteUnit {
+      * One more than the highest normal UDateAbsoluteUnit value.
+      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
+      */
+-    UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 2
++    UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
+ #endif  // U_HIDE_DEPRECATED_API
+ } UDateAbsoluteUnit;
+ 
diff --git a/source/i18n/reldatefmt.cpp b/source/i18n/reldatefmt.cpp
index a7520d3..15d5e99 100644
--- a/source/i18n/reldatefmt.cpp
+++ b/source/i18n/reldatefmt.cpp
@@ -315,6 +315,10 @@
                 return UDAT_ABSOLUTE_FRIDAY;
             case SATURDAY:
                 return UDAT_ABSOLUTE_SATURDAY;
+            case HOUR:
+                return UDAT_ABSOLUTE_HOUR;
+            case MINUTE:
+                return UDAT_ABSOLUTE_MINUTE;
             default:
                 return -1;
         }
@@ -1157,6 +1161,8 @@
         case UDAT_REL_UNIT_THURSDAY:  absunit = UDAT_ABSOLUTE_THURSDAY; break;
         case UDAT_REL_UNIT_FRIDAY:  absunit = UDAT_ABSOLUTE_FRIDAY; break;
         case UDAT_REL_UNIT_SATURDAY:  absunit = UDAT_ABSOLUTE_SATURDAY; break;
+        case UDAT_REL_UNIT_HOUR:  absunit = UDAT_ABSOLUTE_HOUR; break;
+        case UDAT_REL_UNIT_MINUTE:  absunit = UDAT_ABSOLUTE_MINUTE; break;
         default: break;
     }
     if (direction != UDAT_DIRECTION_COUNT && absunit != UDAT_ABSOLUTE_UNIT_COUNT) {
diff --git a/source/i18n/unicode/reldatefmt.h b/source/i18n/unicode/reldatefmt.h
index 16ae91a..1533ac6 100644
--- a/source/i18n/unicode/reldatefmt.h
+++ b/source/i18n/unicode/reldatefmt.h
@@ -172,6 +172,18 @@
      * @draft ICU 63
      */
     UDAT_ABSOLUTE_QUARTER,
+
+    /**
+     * Hour
+     * @draft ICU 65
+     */
+    UDAT_ABSOLUTE_HOUR,
+
+    /**
+     * Minute
+     * @draft ICU 65
+     */
+    UDAT_ABSOLUTE_MINUTE,
 #endif // U_HIDE_DRAFT_API
 
 #ifndef U_HIDE_DEPRECATED_API
@@ -179,7 +191,7 @@
      * One more than the highest normal UDateAbsoluteUnit value.
      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
      */
-    UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 2
+    UDAT_ABSOLUTE_UNIT_COUNT = UDAT_ABSOLUTE_NOW + 4
 #endif  // U_HIDE_DEPRECATED_API
 } UDateAbsoluteUnit;