如何强制日期在时区更改后不会更改日期?

时间:2015-05-20 18:32:44

标签: java android date

示例:我的应用程序包含两个片段。用户操作:

  1. 在fragment1用户中选择日期(此日期存储为Date对象)
  2. 用户转到系统设置并更改时区
  3. 用户返回应用程序并按下fragment1中的按钮(Date对象传递给fragment2并在TextView中显示)
  4. 问题:用户选择的日期和他在fragment2上看到的日期不同。例如:

    • 初始时区-11
    • 用户选择06/01/2015
    • 新时区+13
    • 在fragment2上,用户请参见06/02/2015

    如何确保时区更改后日期不会发生变化?为什么会这样?

2 个答案:

答案 0 :(得分:1)

日期是一个解释问题。您可以存储包含原始时区的日期,或者您可以将其存储在UTC中,然后如果要以UTC格式显示它或者应用新的时区(可能还有DSL),则可以决定输出。你需要的是一致性。

答案 1 :(得分:1)

无论系统时区如何,

日期值始终为UTC。显示日期时,可以使用 DateFormat 将日期转换为系统时区。

您可以为 android.intent.action.TIMEZONE_CHANGED 意图注册 BroadcastReceiver ,并在更改时区时重新格式化日期。 Date 对象的值保持不变,但 DateFormat 会将其格式化为新时区

更新

Timezone example in broadcast receiver

采用的示例
<receiver android:name=".TimeZoneChangedReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.TIMEZONE_CHANGED " />
    </intent-filter>
</receiver>

在TimeZoneChangedReceiver

@Override
public void onReceive(final Context context, final Intent intent) {
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");
    String formattedDate = format.format(now);
    mDateView.setText(formattedDate)
}