如何在android中检测夏令时转换



我有一个安卓应用程序,它有一个服务开关,可以根据一些时间计算发出警报。

问题是时区何时更改(即:对于位于法国并从UTC+1变为UTC+2的用户)。应用程序没有收到此更改的通知,因此会延迟触发警报。

我已经检查了android时区API,知道有一些方法可以帮助,如:

  • 使用DaylightTime()

  • inDaylightTime(日期时间)

  • getDSTSavings()

是否可以知道更改何时发生,以便在我的计算算法中考虑它?

BTW:我已经查看了很多博客和Stackoverflow的问答,但不要帮忙:(

EDIT(清单文件和接收器类):

这是我的清单:

<receiver android:name=".receiver.NotificationReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.TIMEZONE_CHANGED" />
    </intent-filter>
</receiver>

接收器类别:

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        WakeLock.acquire(context);
        Intent service = new Intent(context, NotificationService.class);
        service.putExtras(intent);
        context.startService(service);
        // Timezone or time change
        if (intent.getAction() != null
            && (intent.getAction().equals(Intent.ACTION_TIME_CHANGED)
                || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)))
        {
            Intent i = new Intent(context, DialogPopUpTimeChange.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

好吧,下面是我如何解决这个问题的:

1-我保留了Android清单原样(见问题)

2-然后我把接收器换了一点:

public class NotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        WakeLock.acquire(context);
        // Timezone or time change
        if (intent.getAction() != null
            && (intent.getAction().equals(Intent.ACTION_TIME_CHANGED)
            || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)))
        {
            calculateTimeZone(context);
        }
    }
}

3-以下是计算新时区的方法和DST:的使用

public void calculateTimeZone(Context context) {
    float ONE_HOUR_MILLIS = 60 * 60 * 1000;
    // Current timezone and date
    TimeZone timeZone = TimeZone.getDefault();
    Date nowDate = new Date();
    float offsetFromUtc = timeZone.getOffset(nowDate.getTime()) / ONE_HOUR_MILLIS;
    // Daylight Saving time
    if (timeZone.useDaylightTime()) {
        // DST is used
        // I'm saving this is preferences for later use
        // save the offset value to use it later
        float dstOffset = timeZone.getDSTSavings() / ONE_HOUR_MILLIS;
        // DstOffsetValue = dstOffset
        // I'm saving this is preferences for later use
        // save that now we are in DST mode
        if (timeZone.inDaylightTime(nowDate)) {
            // Now you are in use of DST mode
            // I'm saving this is preferences for later use
        } else {
            // DST mode is not used for this timezone
            // I'm saving this is preferences for later use
        }
    }
}

就是这样。所以,解决方案是将所有的Api(在问题中列出)组合在一起。

我希望这个解决方案能帮助其他人。如果你有任何问题只需在评论中发布即可

相关内容

  • 没有找到相关文章

最新更新