ICU-20654 Add hour/minute for "this hour/minute"

Fix expectation in cintltest

add tests

ICU-20654 Add hour/minute for "this hour/minute"

See #674
This commit is contained in:
Frank Tang 2019-06-04 18:14:27 -07:00 committed by Frank Yung-Fong Tang
parent 5b4befd67c
commit 78f341ce7e
6 changed files with 53 additions and 14 deletions

View file

@ -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) {

View file

@ -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;

View file

@ -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 */

View file

@ -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"},

View file

@ -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),

View file

@ -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 */