相关疑难解决方法(0)

我们该怎么做才能为2038做准备?

我想我今天写的一些软件将在30年内使用.但我也意识到,很多都是基于UNIX传统,即将时间暴露为自1970年以来的秒数.

#include <stdio.h>
#include <time.h>
#include <limits.h>

void print(time_t rt) {
    struct tm * t = gmtime(&rt);
    puts(asctime(t));
}

int main() {
    print(0);
    print(time(0));
    print(LONG_MAX);
    print(LONG_MAX+1);
}
Run Code Online (Sandbox Code Playgroud)

执行结果:

  • 1970年1月1日00:00:00
  • 2008年8月30日星期六18:37:08
  • 星期二1月19日3时14分07秒2038
  • 12月13 星期五20:45:52 1901

函数ctime(),gmtime()和localtime()都将一个时间值作为参数,该时间值表示自Epoch(1970年1月1日00:00:00 UTC;参见时间(3))以来的时间(以秒为单位).

我想知道作为程序员在这个领域是否有任何主动做的事情,或者我们是否相信所有软件系统(又称操作系统)将来会如何神奇地升级?

更新看起来确实64位系统是安全的:

import java.util.*;

class TimeTest {
    public static void main(String[] args) {
        print(0);
        print(System.currentTimeMillis());
        print(Long.MAX_VALUE);
        print(Long.MAX_VALUE + 1);
    }

    static void print(long l) {
        System.out.println(new Date(l));
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 12月31日星期三16:00:00太平洋标准时间1969年
  • 2008年8月30日星期六12:02:40 PDT 2008
  • 8月16日星期六23:12:55太平洋标准时间292278994
  • 太阳12月02日08:47:04太平洋标准时间292269055

但那一年292278994呢?

unix maintainability time year2038

60
推荐指数
2
解决办法
6785
查看次数

MySQL的日期时间和时间戳字段是否更适合PHP应用程序,然后是Unix时间戳整数?

我正在阅读一篇文章,该文章展示了一些关于三种不同的MySQL日期/时间存储选项执行情况的非常好的信息和基准.

MySQL DATETIME与TIMESTAMP对比INT性能和与MyISAM的基准测试

在阅读本文时,您开始意识到使用整数只是一种浪费,您应该使用MySQL Datetime或Timestamp列类型.

然而,在文章的最后,他再做了一次不使用MySQL函数的测试,你突然发现直接INT的速度是使用unix时间戳搜索时两个MySQL选项的2倍.

所以它突然恍然大悟 - 呃,PHP应用程序都使用了什么? 时间()!几乎每个php应用程序都将其逻辑基于Unix Epoch.这意味着在特定时间内对结果的大多数查询都是基于time()开始的,然后转换为使用MySQL的字段.

这让我有以下几点:

  1. 存储为INT的Unix时间戳更快,占用更少的空间,并且可以在PHP的基于时间()的计算中原生工作.

  2. MySQL日期类型更适合MySQL方面的操作和逻辑.

  3. 目前,Unix和MySQL时间戳只能在2037年之前工作,这意味着您必须在将来使用日期时间字段表示更大的日期.

  4. date = NOW()使用复制导致数据不一致时,MySQL命令可能会滞后.

所以将这个应用到现实生活中我们看到这些结果给出的答案,大多数真正的DBA会使用像PostgreSQL这样的更好的引擎 - 是否有arny

但是,大多数使用数据库逻辑的应用程序可能会使用PostgreSQL.这意味着我们所有其他程序员只使用MySQL作为我们数据的存储槽(你知道这是真的)这使得保持字段小,快,UNIX INT看起来它实际上是最好的选择.

那你觉得怎么样?

时间戳是否真的比MySQL日期字段更适合PHP应用程序?

php mysql int timestamp

8
推荐指数
1
解决办法
4043
查看次数

在Knex dateTime()/ MySQL DATETIME字段中存储Node.js日期

我在查找Node.js,knex和MySQL(通过Bookshelf)常见的日期格式时遇到了一些麻烦.

我使用Knex架构构建器设置了一个表:

knex.schema.createTableIfNotExists("examples", function (table) {
    ...
    table.dateTime("some_datetime");
})
Run Code Online (Sandbox Code Playgroud)

这将DATETIME在MySQL中创建一个类型的列.

我有一个代表这个的Bookshelf模型(在这里省略了所有的样板文件),我尝试使用内置Date.now()的值:

exampleModel.save({
    some_datetime: Date.now()
})
Run Code Online (Sandbox Code Playgroud)

在Knex中打开调试后,我看到查询实际上是在尝试插入一个毫秒的纪元时间戳("......"为简洁起见):

{ ...
  bindings: [ 1485644012453, ... ],
  sql: 'update `examples` set `some_datetime` = ? where `id` = ?' }
Run Code Online (Sandbox Code Playgroud)

但这是不正确的,因为MySQL希望你FROM_UNIXTIME在这种情况下使用,因此数据库中的结果日期当然是好的0000-00-00 00:00:00.

我应该在这做什么才能使这一切保持一致?

  • 在创建表时,我应该在模式构建器中使用不同的类型吗?
  • 或者,我是否应该使用不同的东西来获取日期Date.now()
  • 或者是其他东西?

我在这里找不到共同点.我的直觉说dateTime在使用Knex,Date.now()在Node中,DATETIME在MySQL中,但这是不正确的.

只是要清楚:这个问题不一定集中在什么是哲学正确的-此刻,我居然无法弄清楚如何存储日期/数据库倍一切.我正在寻找一个有效的组合,语义正确只会是一个奖励.

javascript mysql node.js knex.js

6
推荐指数
2
解决办法
1万
查看次数

如何在MySQL中存储最近的使用频率

我正在研究应用程序的Product Catalog模块Invoicing.

当用户创建新发票时,该product name字段应为自动填充字段,该字段显示产品目录中最近使用的产品.

如何在数据库中存储此"使用新近度/频率"?

我正在考虑添加一个新的字段recency,1每次使用该产品时都会增加,而1/(count of all products)当使用其他产品时,该字段会减少.然后使用此recency字段进行排序,但在我看来这不是最好的解决方案.

你能帮我解决一下这类问题的最佳做法吗?

mysql sql database

6
推荐指数
1
解决办法
623
查看次数

标签 统计

mysql ×3

database ×1

int ×1

javascript ×1

knex.js ×1

maintainability ×1

node.js ×1

php ×1

sql ×1

time ×1

timestamp ×1

unix ×1

year2038 ×1