0

我正在实施简单的文件共享服务。目前我使用基于文件的数据库(因为它适合我的需要)。

   # somewhere in my cgi script
   sub first_run
    {
      my $dbh = DBI->connect('dbi:DBM:');
      $dbh = DBI->connect("dbi:DBM:", "", "",{ AutoCommit => 1, RaiseError => 1, f_dir=>$DATABASE_DIR} );
      unless ($dbh)
      {
        print "<br>Cannot connect: $DBI::errstr";
        return undef;
      }
      $dbh->do("CREATE TABLE uploads( user_name TEXT,
        file_name TEXT, 
        upload_date TEXT ) ");
      $dbh->disconnect( );
    }

如您所见,我建议将上传时间戳存储为字符串,因为目前我只需要显示它(假设使用 localtime() 来获取人类可读格式的时间戳)。但这在我看来有些糟糕。如果稍后我想显示某个时期的上传内容,等等。

在不使用第三方 CPAN 模块的情况下,在 DBM 数据库中存储时间戳的常用方法是什么?我以后如何将它们拉出来并显示给用户(在我的情况下,转换回字符串)?

4

2 回答 2

1

考虑到存储 UTC 时间比存储本地时间更明确。如果您在伦敦的计算机上节省时间并在香港将文件发送给我,当我在您的程序中加载文件时,我会看到您实际节省的时间吗?

考虑到在存储 UTC 时间时,您(至少)有两种选择:格式化的时间字符串,或自特定时间(“纪元”)以来的(秒/毫秒/其他)的计数。据推测,任何一种格式都与另一种同构,因为从一种格式到另一种格式都有明确定义的双向转换。

于 2009-04-02T16:33:57.620 回答
0

我只是存储时代,然后很容易用 *localtime* 或 *strftime* 显示它。

如果您真的希望能够浏览数据库的内容而不必转换回纪元,您可以存储数值和 *localtime* 字符串(“ `1238693517 - Thu Apr 2 19:31:57 2009` ”)。这使得数据冗余和非规范化,但也使其易于检查,同时仍然能够处理数值。你的来电。

于 2009-04-02T17:34:37.053 回答