1

我对时间戳格式不太熟悉。

例如,我有一个文本

'Jul 19, 2013 12:00 pm' 

我想将它存储到mysql。这个时间戳在 MySQL 中是什么格式,在将它传递给 mysql 之前,我应该如何在 perl 中正确格式化它。

谢谢。

4

2 回答 2

4

MySQL中时间戳的格式是什么?

强烈建议您阅读MySQL 手册。与在 StackOverflow 上发布问题相比,您将获得更快的答案。从文档

TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

如您所见,格式为YYYY-MM-DD HH:MM:SS.

正如ysth在评论中指出的那样,MySQL 也有一个DATETIME数据类型:

MySQL 以 'YYYY-MM-DD HH:MM:SS' 格式检索和显示 DATETIME 值。支持的范围是“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。

需要注意的几点:

  • DATETIME并且TIMESTAMP都使用格式YYYY-MM-DD HH:MM:SS
  • 支持的日期DATETIME范围远大于TIMESTAMP
  • TIMESTAMP将值转换为 UTC 进行存储,并在检索时返回本地时区;DATETIME不进行时区转换

如果您还没有习惯于TIMESTAMP您可能会考虑使用的数据类型DATETIME,这取决于您尝试存储的数据类型。有关vs.的更多详细信息,请参阅此 StackOverflow 问题DATETIMETIMESTAMP

在将其传递给 MySQL 之前,我应该如何在 Perl 中对其进行格式化?

要在 Perl 中将日期/时间字符串转换为不同的格式,您可以使用核心(自 v5.9 起)模块Time::Piece

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Time::Piece;

my $date = 'Jul 19, 2013 12:00 pm';
my $t = Time::Piece->strptime($date, '%b %d, %Y %I:%M %p');
say $t->strftime('%F %T');
# 2013-07-19 12:00:00

从您的示例日期字符串中不清楚日期和小时是否是零填充的。上面的示例假定格式如下

2013 年10 月105:00上午

小于十的天数和小时数以零开头。如果您的输入格式实际上是

2013 年10 月1日上午5

那么您需要更改传递给Time::Piece->strptime. 可以在strftime 的手册页中找到格式说明符列表。

于 2013-10-06T14:40:44.097 回答
1

Time::Piece自 5.9 以来一直是 Perl 的核心模块。它提供了一种方便的方法来解析任何时间格式的输入(使用strptime())并生成不同格式的输出(使用strftime().

#cat ./tconv
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
my $t = Time::Piece->strptime( shift, "%b %d, %Y %I:%M %p" );
print $t->epoch, "\n";
print $t->strftime( $t, "%Y/%m/%d %T %z" ), "\n";

#./tconv "Jul 19, 2013 12:00 pm"
1374235200
Fri Jul 19 12:00:00 2013
于 2013-10-06T14:29:03.330 回答