Android是否提供用于确定可识别区域设置的周末日期的API?

Jym*_*myZ 5 android locale calendar

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

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

在英语(英国),Calendar#getFirstDayOfWeek返回Calendar.MONDAY,他们工作周的第一天是星期一.他们的周末时间是Calendar.SATURDAYCalendar.SUNDAY.

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

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

Android中是否有任何方法可以确定周末日?我们有一些涵盖大多数西方案例的逻辑,但它很脆弱,并且区域设置感知平台API是理想的,但我不知道.

请注意,我不是要求对某些"最佳"库或任何类型的库提出建议.我在询问Android平台上是否存在任何此类区域设置数据,如果存在,则存在哪些API调用来访问此数据.

小智 1

Awareness API 中新发布了快照和栅栏 API,可用于时间区域设置感知 API 的用例。

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

例如,以下代码片段检查快照 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
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果您希望您的应用程序在设备区域设置的下周末或节假日收到回调,则可以使用新的 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);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)