From 824cb460ac8ac243f8d0dd3c88e3d482df104599 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Wed, 8 Oct 2014 11:36:52 +0200 Subject: [PATCH] DateTimeFormat: handle custom 24 hours clock. The "j" format pattern selects a 12 or 24 hours clock automatically depending on the locale, but it doesn't work when the format is forced in the locale preflet or through the BFormattingConventions API. So we manually pick either K or H depending on that setting. --- src/kits/locale/DateTimeFormat.cpp | 8 +++++-- src/tests/kits/locale/DateFormatTest.cpp | 27 ++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/kits/locale/DateTimeFormat.cpp b/src/kits/locale/DateTimeFormat.cpp index 794edc1705..eb4bcea85d 100644 --- a/src/kits/locale/DateTimeFormat.cpp +++ b/src/kits/locale/DateTimeFormat.cpp @@ -61,8 +61,12 @@ BDateTimeFormat::SetDateTimeFormat(BDateFormatStyle dateStyle, skeleton << "dd"; if (elements & B_DATE_ELEMENT_AM_PM) skeleton << "a"; - if (elements & B_DATE_ELEMENT_HOUR) - skeleton << "jj"; + if (elements & B_DATE_ELEMENT_HOUR) { + if (fConventions.Use24HourClock()) + skeleton << "HH"; + else + skeleton << "KK"; + } if (elements & B_DATE_ELEMENT_MINUTE) skeleton << "mm"; if (elements & B_DATE_ELEMENT_SECOND) diff --git a/src/tests/kits/locale/DateFormatTest.cpp b/src/tests/kits/locale/DateFormatTest.cpp index 0eb96ff947..733282dd9e 100644 --- a/src/tests/kits/locale/DateFormatTest.cpp +++ b/src/tests/kits/locale/DateFormatTest.cpp @@ -28,15 +28,34 @@ DateFormatTest::~DateFormatTest() void DateFormatTest::TestCustomFormat() { - int32 fields = B_DATE_ELEMENT_HOUR | B_DATE_ELEMENT_MINUTE; - BDateTimeFormat format; BString buffer; + BLanguage language("en"); + BFormattingConventions formatting("en_US"); + int32 fields = B_DATE_ELEMENT_HOUR | B_DATE_ELEMENT_MINUTE; + + BDateTimeFormat format(&language, &formatting); + + NextSubTest(); + + formatting.SetExplicitUse24HourClock(true); + format.SetFormattingConventions(formatting); format.SetDateTimeFormat(B_SHORT_DATE_FORMAT, B_SHORT_TIME_FORMAT, fields); - status_t result = format.Format(buffer, 12345, B_SHORT_DATE_FORMAT, + status_t result = format.Format(buffer, 12345678, B_SHORT_DATE_FORMAT, B_SHORT_TIME_FORMAT); CPPUNIT_ASSERT_EQUAL(B_OK, result); - CPPUNIT_ASSERT_EQUAL(BString("04:25"), buffer); + CPPUNIT_ASSERT_EQUAL(BString("22:21"), buffer); + + NextSubTest(); + + formatting.SetExplicitUse24HourClock(false); + format.SetFormattingConventions(formatting); + format.SetDateTimeFormat(B_SHORT_DATE_FORMAT, B_SHORT_TIME_FORMAT, fields); + result = format.Format(buffer, 12345678, B_SHORT_DATE_FORMAT, + B_SHORT_TIME_FORMAT); + + CPPUNIT_ASSERT_EQUAL(B_OK, result); + CPPUNIT_ASSERT_EQUAL(BString("10:21 PM"), buffer); }