1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef intl_components_DateIntervalFormat_h_
#define intl_components_DateIntervalFormat_h_
#include "mozilla/intl/Calendar.h"
#include "mozilla/intl/DateTimePart.h"
#include "mozilla/intl/ICU4CGlue.h"
#include "mozilla/intl/ICUError.h"
#include "mozilla/Result.h"
#include "mozilla/Span.h"
#include "mozilla/UniquePtr.h"
#include "unicode/udateintervalformat.h"
#include "unicode/utypes.h"
namespace mozilla::intl {
class Calendar;
using AutoFormattedDateInterval =
AutoFormattedResult<UFormattedDateInterval, udtitvfmt_openResult,
udtitvfmt_resultAsValue, udtitvfmt_closeResult>;
/**
* This component is a Mozilla-focused API for the date range formatting
* provided by ICU. This DateIntervalFormat class helps to format the range
* between two date-time values.
*
* https://tc39.es/ecma402/#sec-formatdatetimerange
* https://tc39.es/ecma402/#sec-formatdatetimerangetoparts
*/
class DateIntervalFormat final {
public:
/**
* Create a DateIntervalFormat object from locale, skeleton and time zone.
* The format of skeleton can be found in [1].
*
* Note: Skeleton will be removed in the future.
*
* [1]: https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns
*/
static Result<UniquePtr<DateIntervalFormat>, ICUError> TryCreate(
Span<const char> aLocale, Span<const char16_t> aSkeleton,
Span<const char16_t> aTimeZone);
~DateIntervalFormat();
/**
* Format a date-time range between two Calendar objects.
*
* DateIntervalFormat cannot be changed to use a proleptic Gregorian
* calendar, so use this method if the start date is before the Gregorian
* calendar is introduced(October 15, 1582), otherwise use TryFormatDateTime
* instead.
*
* The result will be stored in aFormatted, caller can use
* AutoFormattedDateInterval::ToSpan() to get the formatted string, or pass
* the aFormatted to TryFormattedToParts to get the parts vector.
*
* aPracticallyEqual will be set to true if the date times of the two
* calendars are equal.
*/
ICUResult TryFormatCalendar(const Calendar& aStart, const Calendar& aEnd,
AutoFormattedDateInterval& aFormatted,
bool* aPracticallyEqual) const;
/**
* Format a date-time range between two Unix epoch times in milliseconds.
*
* The result will be stored in aFormatted, caller can use
* AutoFormattedDateInterval::ToSpan() to get the formatted string, or pass
* the aFormatted to TryFormattedToParts to get the parts vector.
*
* aPracticallyEqual will be set to true if the date times of the two
* Unix epoch times are equal.
*/
ICUResult TryFormatDateTime(double aStart, double aEnd,
AutoFormattedDateInterval& aFormatted,
bool* aPracticallyEqual) const;
/**
* Convert the formatted DateIntervalFormat into several parts.
*
* The caller get the formatted result from either TryFormatCalendar, or
* TryFormatDateTime methods, and instantiate the DateTimePartVector. This
* method will generate the parts and insert them into the vector.
*
* See:
* https://tc39.es/ecma402/#sec-formatdatetimerangetoparts
*/
ICUResult TryFormattedToParts(const AutoFormattedDateInterval& aFormatted,
DateTimePartVector& aParts) const;
private:
DateIntervalFormat() = delete;
explicit DateIntervalFormat(UDateIntervalFormat* aDif)
: mDateIntervalFormat(aDif) {}
DateIntervalFormat(const DateIntervalFormat&) = delete;
DateIntervalFormat& operator=(const DateIntervalFormat&) = delete;
ICUPointer<UDateIntervalFormat> mDateIntervalFormat =
ICUPointer<UDateIntervalFormat>(nullptr);
};
} // namespace mozilla::intl
#endif
|