我对时间戳格式不熟悉。
我有一个例如
的文字'Jul 19, 2013 12:00 pm'
我想将它存储到mysql中。 MySQL中这个时间戳的格式是什么,如何在将其传递给mysql之前在perl中正确格式化。
感谢。
答案 0 :(得分:4)
我高度建议您阅读MySQL manual。通过在StackOverflow上发布问题,您可以更快地得到答案。来自docs:
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
,具体取决于您尝试存储的数据类型。有关DATETIME
与TIMESTAMP
的详细信息,请参阅this StackOverflow question。
要在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
从您的示例日期字符串中不清楚日期和小时是否为零填充。上面的示例采用类似
的格式10月 01 ,2013 05 :00 am
小于10的日和小时以零开头。如果您的输入格式实际上是
10月 1 ,2013 5 :00 am
然后您需要更改传递给Time::Piece->strptime
的格式字符串。可以在man page for strftime中找到格式说明符列表。
答案 1 :(得分:1)
Time::Piece一直是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