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

Java 如何在android中检测夏令时转换,java,android,timezone,dst,Java,Android,Timezone,Dst,我有一个安卓应用程序,它有一个服务,根据一些时间计算发出警报 问题在于时区发生变化时(,即:对于位于法国的用户,从UTC+1转到UTC+2)。应用程序不会收到有关此更改的通知,因此会延迟触发警报 我已经检查过android,知道有一些方法可以帮助我,比如: 是否有可能< >知道何时发生变化,以便在我的计算算法中考虑? 顺便说一句:我已经查阅了很多博客和Stackoverflow的问答,但是 不要帮忙:( 编辑(清单文件和接收者类别): 这是我的舱单: <receiver an

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

问题在于时区发生变化时(,即:对于位于法国的用户,从UTC+1转到UTC+2)。应用程序不会收到有关此更改的通知,因此会延迟触发警报

我已经检查过android,知道有一些方法可以帮助我,比如:

<强>是否有可能< <强> >知道何时发生变化,以便在我的计算算法中考虑?

顺便说一句:我已经查阅了很多博客和Stackoverflow的问答,但是 不要帮忙:(

编辑(清单文件和接收者类别):

这是我的舱单:

<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>

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

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(在问题中列出)组合在一起

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


可能重复的Nope,它不是重复的,因为我已经尝试使用BroadcastReceiver,但没有帮助。我想知道时区何时会发生更改您在问题中没有这样说。为什么您不能在时间结束时使用BroadcastReceiver更新警报更改?您在我添加详细信息时发表了评论:)对于BroadcastReceiver,如果电信公司进行了更改,它不会接收任何内容。这就是为什么我在寻找另一种选择。你的结果与其他答案的说法相反。根据设备与运营商重新同步的频率,可以经常触发时间更改广播,一天几次,甚至一分钟几次。我已经看到了几种不同的解决方法来检测“真实的”DST更改。甚至声称
AlarmManager
自动处理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
        }
    }
}