Android 是否提供 API 来确定可识别区域设置的周末?

Does Android provide an API for determining weekend days that is locale-aware?

我想为可识别工作日和周末的应用程序提供一些样式,但我需要它能够识别区域设置。我知道 Calendar#getFirstDayOfWeek,但这只是 returns 一周的第一天,而不是工作周的第一天。

例如,英语(加拿大)Calendar#getFirstDayOfWeek returns Calendar.SUNDAY,这是我们一周的第一天。我们的工作周从 Calendar.MONDAY 开始,周末是 Calendar.SATURDAYCalendar.SUNDAY

在英语(英国)中,Calendar#getFirstDayOfWeek returns Calendar.MONDAY,他们工作周的第一天是星期一。他们的周末是 Calendar.SATURDAYCalendar.SUNDAY.

对于像希伯来语这样的语言环境,事情变得棘手。他们一周的第一天是 Calendar.SUNDAY,但他们工作周的第一天不是 Calendar.MONDAY,而是 Calendar.SUNDAY。他们的周末是 Calendar.FRIDAYCalendar.SATURDAY。埃及也一样。

伊朗只有一个周末,Calendar.FRIDAY

在Android中有没有什么方法可以确定周末?我们有一些涵盖大多数西方案例的逻辑,但它很脆弱,并且一个区域感知平台 API 将是理想的,但我不知道一个。

请注意,我并不是要对某些 ​​"best" 图书馆或任何类似的东西提出建议。我想问 Android 平台上是否存在任何此类区域设置数据,如果存在,存在哪些 API 调用来访问此数据。

Awareness API 中有新发布的快照和围栏 API 用于您的 use-case locale-aware API 时间。

请查看 Awareness.SnapshotApi.getTimeIntervals,其中 return 是一个 TimeIntervalsResult。您可以调用 getTimeIntervals() 方法来 return 一个对象,该对象具有有关当前区域设置的当前时间属性的信息(特别是您要求的周末和假期)。

例如,以下代码片段检查在调用快照 api 时设备的区域设置是否是周末。

Awareness.SnapshotApi.getTimeIntervalsmGoogleApiClient)
    .setResultCallback(new ResultCallback<TimeIntervalsResult>() {
        @Override
        public void onResult(@NonNull TimeIntervalsResult result) {
            if (!result.getStatus().isSuccess()) {
                Log.e(TAG, "Could not get the time intervals");
                return;
            }
            if (result.getTimeIntervals().hasTimeInterval(
                TimeFence.TIME_INTERVAL_WEEKEND)) {
                // do your custom action, this means it is weekend at the 
                // device locale at this time
            }
        }

如果您希望您的应用在下周末或节假日在设备区域得到回调,您可以使用新的 TimeFence Api inTimeInterval()。比如借用开发者文档中的代码片段,

// Create TimeFence
AwarenessFence weekendHolidayFence = Awareness.or(
    TimeFence.inTimeInterval(TimeFence.TIME_INTERVAL_WEEKEND),
    TimeFence.inTimeInterval(TimeFence.TIME_INTERVAL_HOLIDAY))

Awareness.FenceApi.updateFences(
    mGoogleApiClient,
    new FenceUpdateRequest.Builder()
        .addFence("fenceKey", weekendHolidayFence, myPendingIntent)
        .build())
    .setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                Log.i(TAG, "Fence was successfully registered.");
            } else {
                Log.e(TAG, "Fence could not be registered: " + status);
            }
        }
    });