diff --git a/icu4c/source/i18n/reldatefmt.cpp b/icu4c/source/i18n/reldatefmt.cpp index 3c414363389..f66092ba948 100644 --- a/icu4c/source/i18n/reldatefmt.cpp +++ b/icu4c/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/icu4c/source/i18n/unicode/reldatefmt.h b/icu4c/source/i18n/unicode/reldatefmt.h index a316244bc6b..6b37d22165c 100644 --- a/icu4c/source/i18n/unicode/reldatefmt.h +++ b/icu4c/source/i18n/unicode/reldatefmt.h @@ -175,6 +175,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 @@ -182,7 +194,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/icu4c/source/test/cintltst/crelativedateformattest.c b/icu4c/source/test/cintltst/crelativedateformattest.c index 46c98a7d68a..8b5c90f6b47 100644 --- a/icu4c/source/test/cintltst/crelativedateformattest.c +++ b/icu4c/source/test/cintltst/crelativedateformattest.c @@ -171,8 +171,8 @@ static const char* en_decDef_long_midSent_min[kNumOffsets*2] = { "2 minutes ago", "2 minutes ago", /* -2 */ "1 minute ago", "1 minute ago", /* -1 */ "0.7 minutes ago", "0.7 minutes ago", /* -0.7 */ - "0 minutes ago", "0 minutes ago", /* -0 */ - "in 0 minutes", "in 0 minutes", /* 0 */ + "this minute", "0 minutes ago", /* -0 */ + "this minute", "in 0 minutes", /* 0 */ "in 0.7 minutes", "in 0.7 minutes", /* 0.7 */ "in 1 minute", "in 1 minute", /* 1 */ "in 2 minutes", "in 2 minutes", /* 2 */ @@ -186,8 +186,8 @@ static const FieldsDat en_attrDef_long_midSent_min[kNumOffsets*2] = { {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "2 minutes ago", "2 minutes ago", -2 */ {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "1 minute ago", "1 minute ago", -1 */ {UDAT_REL_NUMERIC_FIELD, 0, 3}, {UDAT_REL_NUMERIC_FIELD, 0, 3}, /* "0.7 minutes ago", "0.7 minutes ago", -0.7 */ - {UDAT_REL_NUMERIC_FIELD, 0, 1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "0 minutes ago", "0 minutes ago", -0 */ - {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 0 minutes", "in 0 minutes", 0 */ + {-1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 0, 1}, /* "this minute", "0 minutes ago", -0 */ + {-1, -1, -1}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "this minute", "in 0 minutes", 0 */ {UDAT_REL_NUMERIC_FIELD, 3, 6}, {UDAT_REL_NUMERIC_FIELD, 3, 6}, /* "in 0.7 minutes", "in 0.7 minutes", 0.7 */ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 1 minute", "in 1 minute", 1 */ {UDAT_REL_NUMERIC_FIELD, 3, 4}, {UDAT_REL_NUMERIC_FIELD, 3, 4}, /* "in 2 minutes", "in 2 minutes", 2 */ diff --git a/icu4c/source/test/intltest/reldatefmttest.cpp b/icu4c/source/test/intltest/reldatefmttest.cpp index baccceb33cd..b52f0acd7d4 100644 --- a/icu4c/source/test/intltest/reldatefmttest.cpp +++ b/icu4c/source/test/intltest/reldatefmttest.cpp @@ -286,6 +286,8 @@ static WithoutQuantityExpected kEnglishNoQuantity[] = { {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Friday"}, {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Saturday"}, {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sunday"}, + {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_HOUR, "this hour"}, + {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MINUTE, "this minute"}, {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"}, {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "week"}, @@ -299,6 +301,8 @@ static WithoutQuantityExpected kEnglishNoQuantity[] = { {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"}, {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"}, {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"}, + {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_HOUR, "hour"}, + {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MINUTE, "minute"}, {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"} }; @@ -623,11 +627,11 @@ static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = { {0.5, UDAT_REL_UNIT_SECOND, "in 0.5 seconds"}, {1.0, UDAT_REL_UNIT_SECOND, "in 1 second"}, {2.0, UDAT_REL_UNIT_SECOND, "in 2 seconds"}, - {0.0, UDAT_REL_UNIT_MINUTE, "in 0 minutes"}, + {0.0, UDAT_REL_UNIT_MINUTE, "this minute"}, {0.5, UDAT_REL_UNIT_MINUTE, "in 0.5 minutes"}, {1.0, UDAT_REL_UNIT_MINUTE, "in 1 minute"}, {2.0, UDAT_REL_UNIT_MINUTE, "in 2 minutes"}, - {0.0, UDAT_REL_UNIT_HOUR, "in 0 hours"}, + {0.0, UDAT_REL_UNIT_HOUR, "this hour"}, {0.5, UDAT_REL_UNIT_HOUR, "in 0.5 hours"}, {1.0, UDAT_REL_UNIT_HOUR, "in 1 hour"}, {2.0, UDAT_REL_UNIT_HOUR, "in 2 hours"}, @@ -684,11 +688,11 @@ static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = { {-0.5, UDAT_REL_UNIT_SECOND, "0.5 seconds ago"}, {-1.0, UDAT_REL_UNIT_SECOND, "1 second ago"}, {-2.0, UDAT_REL_UNIT_SECOND, "2 seconds ago"}, - {-0.0, UDAT_REL_UNIT_MINUTE, "0 minutes ago"}, + {-0.0, UDAT_REL_UNIT_MINUTE, "this minute"}, {-0.5, UDAT_REL_UNIT_MINUTE, "0.5 minutes ago"}, {-1.0, UDAT_REL_UNIT_MINUTE, "1 minute ago"}, {-2.0, UDAT_REL_UNIT_MINUTE, "2 minutes ago"}, - {-0.0, UDAT_REL_UNIT_HOUR, "0 hours ago"}, + {-0.0, UDAT_REL_UNIT_HOUR, "this hour"}, {-0.5, UDAT_REL_UNIT_HOUR, "0.5 hours ago"}, {-1.0, UDAT_REL_UNIT_HOUR, "1 hour ago"}, {-2.0, UDAT_REL_UNIT_HOUR, "2 hours ago"}, diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java index 686d8016bc7..18ec64259ea 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java @@ -252,6 +252,20 @@ public final class RelativeDateTimeFormatter { * @provisional This API might change or be removed in a future release. */ QUARTER, + + /** + * Hour + * @draft ICU 65 + * @provisional This API might change or be removed in a future release. + */ + HOUR, + + /** + * Minute + * @draft ICU 65 + * @provisional This API might change or be removed in a future release. + */ + MINUTE, } /** @@ -953,6 +967,8 @@ public final class RelativeDateTimeFormatter { case THURSDAY: absunit = AbsoluteUnit.THURSDAY; break; case FRIDAY: absunit = AbsoluteUnit.FRIDAY; break; case SATURDAY: absunit = AbsoluteUnit.SATURDAY; break; + case HOUR: absunit = AbsoluteUnit.HOUR; break; + case MINUTE: absunit = AbsoluteUnit.MINUTE; break; case SECOND: if (direction == Direction.THIS) { // absunit = AbsoluteUnit.NOW was set above @@ -962,7 +978,6 @@ public final class RelativeDateTimeFormatter { // could just fall through here but that produces warnings useNumeric = true; break; - case HOUR: default: useNumeric = true; break; @@ -1203,8 +1218,8 @@ public final class RelativeDateTimeFormatter { // For white list of units to handle in RelativeDateTimeFormatter. private enum DateTimeUnit { SECOND(RelativeUnit.SECONDS, null), - MINUTE(RelativeUnit.MINUTES, null), - HOUR(RelativeUnit.HOURS, null), + MINUTE(RelativeUnit.MINUTES, AbsoluteUnit.MINUTE), + HOUR(RelativeUnit.HOURS, AbsoluteUnit.HOUR), DAY(RelativeUnit.DAYS, AbsoluteUnit.DAY), WEEK(RelativeUnit.WEEKS, AbsoluteUnit.WEEK), MONTH(RelativeUnit.MONTHS, AbsoluteUnit.MONTH), diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java index 4c6d92c6a8d..63f0732e44e 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RelativeDateTimeFormatterTest.java @@ -405,6 +405,8 @@ public class RelativeDateTimeFormatterTest extends TestFmwk { {Direction.THIS, AbsoluteUnit.FRIDAY, "this Friday"}, {Direction.THIS, AbsoluteUnit.SATURDAY, "this Saturday"}, {Direction.THIS, AbsoluteUnit.SUNDAY, "this Sunday"}, + {Direction.THIS, AbsoluteUnit.HOUR, "this hour"}, + {Direction.THIS, AbsoluteUnit.MINUTE, "this minute"}, {Direction.PLAIN, AbsoluteUnit.DAY, "day"}, {Direction.PLAIN, AbsoluteUnit.WEEK, "week"}, @@ -729,8 +731,8 @@ public class RelativeDateTimeFormatterTest extends TestFmwk { "2 minutes ago", "2 minutes ago", /* -2 */ "1 minute ago", "1 minute ago", /* -1 */ "0.7 minutes ago", "0.7 minutes ago", /* -0.7 */ - "0 minutes ago", "0 minutes ago", /* -0 */ - "in 0 minutes", "in 0 minutes", /* 0 */ + "this minute", "0 minutes ago", /* -0 */ + "this minute", "in 0 minutes", /* 0 */ "in 0.7 minutes", "in 0.7 minutes", /* 0.7 */ "in 1 minute", "in 1 minute", /* 1 */ "in 2 minutes", "in 2 minutes", /* 2 */