首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多栈应用中夏时制的另一个问题

多栈应用中夏时制的另一个问题
EN

Stack Overflow用户
提问于 2021-11-10 10:42:40
回答 1查看 27关注 0票数 0

我需要帮助来解决夏令时的问题。

应用工作流:

  1. A python脚本每5分钟在esp32 (同一网络)上读取一些传感器值,并将该值添加“acktime”(我读取值时的数据和时间)到带有python的laravel (托管),这将添加olso同步时间(在DB中写入值的数据和时间)
  2. Laravel cronjob为我创建一个每日报告,其中包含传感器

的最大平均值。

将来python总是每5分钟读取一次值,但是会将值存储在本地db中,并且每30分钟同步一次值,这样我就不会因为internet连接丢失而丢失值,所以我添加了“同步时间”,以查看发生了什么和是否发生。

工件的问题:

我的命令组每天将数据库中的所有行:

代码语言:javascript
复制
        $weatherdata = rawData::all()
                    ->groupBy(function (RawData $item) {
                        return $item->acktime->format('Y-m-d');
                    })
                    ->each(function (Collection $day) {
                        foreach ($day as $value){
                              Log::info($value);
                        }
                        Log::info('NEXT DAY');
                    });

它看起来很有效,,但是阅读了日志,我得到了这个问题

代码语言:javascript
复制
{"acktime":"2021-10-30T22:56:45.000000Z",
NEXT DAY  
{"acktime":"2021-10-30T23:01:47.000000Z",

对他来说,在法律时间里,这一天是在一小时前结束的,而这并不是唯一的问题。

如果我将行分组为几个小时而不是一天:

代码语言:javascript
复制
NEXT HOUR  
{"acktime":"2021-10-31T02:02:54.000000Z","temperatur..."}  
..other 23 values when hour is 2 (not ok,total is 24 values)
NEXT HOUR  
{"acktime":"2021-10-31T03:03:58.000000Z","temperatur..."}  
..other 11 values (it's ok,total should be maximum 12)
NEXT HOUR

它把我分组为2:00-3:00,就好像我们只活了一次,但在房地产里,我们做了两次2:00-3:00 .,所以我想:

代码语言:javascript
复制
NEXT HOUR  
{"acktime":"2021-10-31T02:02:54.000000Z","temperatur..."}  
..other 11 value (it's ok,total 12)
NEXT HOUR  
{"acktime":"2021-10-31T03:03:58.000000Z","temperatur..."}  
..other 11 value (it's ok,total 12)
NEXT HOUR
{"acktime":"2021-10-31T02:02:54.000000Z","temperatur.."}  
..other 11 value (it's ok,total 12)

我的app.php设置为:

代码语言:javascript
复制
    'timezone' => 'Europe/London',

我的模特班:

代码语言:javascript
复制
class rawData extends Model
{
    use HasFactory;
  
    protected $fillable = [
        'acktime',
        'temperature',
        'humidity',
        ..other data..
        'synctime'
    ];
    /**
    * The attributes that should be mutated to dates.
    *
    * @var array
    */
    protected $dates = ['acktime','synctime'];
    public $timestamps = false;
}

注意:我昨天刚将acktime和synctime添加为受保护的$dates。

Python脚本:

在读取传感器值之后,python脚本将值直接发送到我的api,但问题可能是如何获得它的数据时间:

代码语言:javascript
复制
from datetime import datetime

def writeData(data):
 data['acktime'] = datetime.now()
 http post

MySql configuration acktime和synctime是datatime类型,UTC is +1运行SHOW GLOBAL VARIABLES LIKE 'time_zone';我不知道如何将get时区存储在datatime行中

最终问题

我将来如何避免这个问题呢?如何恢复已存储的数据时间值??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 10:35:22

我找到的唯一办法就是把时间当作UTC。

UTC的时间不受白天节省时间的影响,这样我就没有订货问题。

因此,第一步是将Lavarvel时区设置为UTC:

config>app.php

代码语言:javascript
复制
'timezone' => 'UTC',

这是一种很好的方法,但是如果您需要使用UTC::now (),您必须提醒现在将在服务器时区服务,所以您需要"UTC“现在的日期时间!

代码语言:javascript
复制
Carbon::now('UTC')

使用UTC作为基准时间,引入另一个“问题”,但问题有解决方案:

做每日报告我不能直接使用Carbon startofDay() end endofDay()函数,但是我需要用本地时区创建一个日期,得到一天的开始和结束,然后将每个日期转换为UTC时区:

代码语言:javascript
复制
        $day = new Carbon($SingleDay);
        $day->setTimezone('Europe/Rome');
        $startTime = $day->copy()->startOfDay();
        $endTime = $day->copy()->endOfDay();
        $startTime->setTimezone('UTC');
        $endTime->setTimezone('UTC');

并且修改了phyton脚本olso,修改了用于存储数据的UTCnow日期时间。

代码语言:javascript
复制
datetime.utcnow()

为了从db恢复数据,我执行了一个查询,从一天中删除一两个小时,这是一项简短的工作,帮助我恢复所有数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69911838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档