我对时间戳格式不太熟悉。
例如,我有一个文本
'Jul 19, 2013 12:00 pm'
我想将它存储到mysql。这个时间戳在 MySQL 中是什么格式,在将它传递给 mysql 之前,我应该如何在 perl 中正确格式化它。
谢谢。
我强烈建议您阅读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 问题。DATETIME
TIMESTAMP
要在 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 月1日05:00上午
小于十的天数和小时数以零开头。如果您的输入格式实际上是
2013 年10 月1日上午5点
那么您需要更改传递给Time::Piece->strptime
. 可以在strftime 的手册页中找到格式说明符列表。
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