gpt4 book ai didi

php - 如何处理 Android 和 PHP/MySQL 之间的时区?

转载 作者:行者123 更新时间:2023-11-28 23:17:44 26 4
gpt4 key购买 nike

我正在构建后端队列系统。我的应用程序的用户需要在上午 08:00:00 左右自动从服务器获取数据,分别针对每个时区。

每个用户都需要分配到一天的特定时间。他只能在此时获取数据,因为该应用程序使用的 API 具有特定的每分钟调用限制。

如何将客户端与服务器同步?

注意

我遇到了具体问题,并且已经解决了。我立即将解决方案作为完整答案发布,其中结合了我在解决问题时在 SO 上找到的许多答案。

最佳答案

解决方案的核心

为清楚起见,使用每个 Java/PHP/MySQL 都支持的 UTC 时间值,因为:

Although GMT and UTC share the same current time in practice, there is a basic difference between the two: GMT is a time zone officially used in some European and African countries. The time can be displayed using both the 24-hour format (0 - 24) or the 12-hour format (1 - 12 am/pm). UTC is not a time zone, but a time standard that is the basis for civil time and time zones worldwide. This means that no country or territory officially uses UTC as a local time.

source

它为您提供了简单的解决方案,因为一旦您使用 UTC,您只需将其转换为服务器或客户端的时区以供显示。

管理客户的时区

您需要将客户端的时区发送到后端以计算您希望他调用 API 的时间。您想将本地时间 08:00:00 转换为 UTC,但这里有一个技巧,因为 Java 和 PHP 之间存在不兼容的时区字符串。

// Java/Android
SimpleDateFormat sdf = new SimpleDateFormat("z");

我住在波兰,使用上面的代码我根据季节得到 2 个不同的值(CET 代表冬季,CEST 代表夏季)。

// PHP
$tz1 = new DateTimeZone('CET');
$tz2 = new DateTimeZone('CEST');

问题是,当我将它传递给 PHP 时,CET 工作得很好,因为它支持时区字符串,但 CEST 不是。

为了统一你的代码,你需要使用:

// Java/Android
SimpleDateFormat sdf = new SimpleDateFormat("ZZZZ");

它给你一个像这样的时区:

GMT+01:00 // for CET
GMT+02:00 // for CEST

Remember that when you send it in URL like http://api.domain.com?timezone=GTM+02:00, you need to change + into %2B as timezone converted to GTM 02:00 won't work in PHP.

计算用户排队时间

获得客户的时区后,在 PHP 中将本地时间 08:00:00 AM 转换为 UTC

$tz = new DateTimeZone('GMT+02:00');
$dt = new DateTime('2017-03-30 08:00:00', $tz);
$dt->setTimezone(new DateTimeZone('UTC'));
echo $dt->format('H:i:s');

// echoes 06:00:00

然后将计算出的值存储在 MySQL 中类型为 TIME 的列中。您无需关心数据库中的时区,因为 TIME 和 DATE 类型与时区无关。

在计算的 UTC 时间设置闹钟

您在应用程序中得到 06:00:00 作为响应,您使用 Calendar 对象设置 AlarmManager,如下所示:

// set UTC as a time zone
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTime(new Date());

long timeNow = cal.getTimeInMillis();

// set 06:00:00
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR_OF_DAY, 6);

// make sure to set alarm in future
long timeAlarm = cal.getTimeInMillis();
if (timeAlarm <= timeNow) {
cal.add(Calendar.HOUR_OF_DAY, 24);
}

alarm.setRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(),
24*60*60*1000, pintent);

关于php - 如何处理 Android 和 PHP/MySQL 之间的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43117726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com