解析 Twitter API 时间戳

28

我正在使用Twitter API返回一系列状态更新及其创建时间。它以以下格式返回创建日期:

Fri Apr 09 12:53:54 +0000 2010

最简单的方式是什么(使用PHP或Javascript),可以将其格式化为09-04-2010?

7个回答

49

通过JavaScript进行跨浏览器、时区感知的解析:

var s = "Fri Apr 09 12:53:54 +0000 2010";

var date = new Date(
    s.replace(/^\w+ (\w+) (\d+) ([\d:]+) \+0000 (\d+)$/,
        "$1 $2 $4 $3 UTC"));

在IE、Firefox、Safari、Chrome和Opera上进行过测试。


14
好的回答。为什么Twitter选择了这种可怕的日期格式? - brad

34

strtotime("dateString");将日期字符串转换为原生的PHP日期格式,然后您可以使用date()函数以您想要的方式打印出来。


听起来不错,谢谢。$time = strtotime($phrase->created_at); echo $time; 给我的结果是 1270817634。我该如何使用 date() 函数呢? - Chris Armstrong
3
啊,等等,我搞定了。date("jS F Y", $time) 给了我 2010年4月9日。谢谢! - Chris Armstrong
是的,PHP中的日期解析非常完善。请注意,strtotime几乎可以接受您输入的任何内容。它虽然费用高昂,但功能强大。 - Alex Mcp
当我使用echo date("Y-m-d H:i:s", strtotime("Wed Nov 19 07:08:49 +0000 2014"))时,PHP将时间打印为2014-11-19 08:08:49。它比原始字符串中的时间提前了一小时,原始字符串中的时间是07:08:49,而在转换后的字符串中是08:08:49。我不知道为什么会这样,但对我来说它不起作用。 - Dashrath
只有在去掉+0000部分时,它才能正确转换日期。 - Dashrath

7

如果从字符串中删除+0000,JavaScript就可以解析该日期:

var dStr = "Fri Apr 09 12:53:54 +0000 2010";
dStr = dStr.replace("+0000 ", "") + " UTC";
var d = new Date(dStr);

Chrome(我猜其他非IE浏览器也可以)可以解析字符串中的+0000,但为了实现互操作性,最好将其删除。

PHP可以使用strtotime解析日期:

strtotime("Fri Apr 09 12:53:54 +0000 2010");

然而,原始日期字符串可能处于UTC时区(因此为+0000)。 new Date()会在本地时区解析它。 - Ates Goral
3
这段代码会在正确的时区解析:dStr = dStr.replace("+0000 ", "") + " GMT"; - Ates Goral
我同意,那很奇怪。更明确地做事似乎是唯一的方法... 我已经将我的方法作为一个单独的答案发布了:https://dev59.com/7XE85IYBdhLWcg3wyGp_#2766516 - Ates Goral
1
@Andy E的头脑:Safari和Chrome都使用WebKit来呈现HTML,但Safari使用SquirrelFish/Nitro,而Chrome使用V8来执行Javascript。这应该是行为差异的原因。 - paracycle
@paracycle:我之前不知道这一点(我以为V8是WebKit的一部分),感谢你澄清了这个问题。@Ates Goral:对你的回答点赞。 - Andy E
显示剩余4条评论

4

这是Twitter API的日期格式:

Sat Jan 19 20:38:06 +0000 2013
"EEE MMM dd HH:mm:ss Z yyyy" 

这里的“Z”是什么意思?是指时区吗?“+0000”代表什么?在IST中是什么时间?GMT +5:30呢? - Siddharth Kumar
@SANDHYALALKUMAR 那是 RFC 822 时区 // https://gist.github.com/romaonthego/5138532 - k06a

3

Javascript。正如@Andy所指出的那样,当涉及到IE时会很麻烦。因此最好依赖于一个能够一致处理它的库。DateJS看起来是一个不错的库。

添加了该库后,您可以解析和格式化它:

var date = Date.parse("Fri Apr 09 12:53:54 +0000 2010");
var formatted = date.toString("dd-MM-yyyy");

在PHP中,您可以使用日期函数或DateTime类来执行相同的操作(自PHP 5.2.0以来可用):

$date = new DateTime("Fri Apr 09 12:53:54 +0000 2010");
echo $date->format("d-m-Y"); // 09-04-2010

这在Chrome中可以工作,但在Internet Explorer中会返回NaN。IE无法处理+0000 - Andy E
谢谢你的提示,安迪。最好是在服务器端处理,或者使用一个日期解析库,比如datejs。 - Anurag
还有一个很好的 jQuery PHPDate 库可用(通过 Google)。 - Alex Mcp
PHPDate看起来是一个很好的日期处理插件。我喜欢他们在首页上为不同格式设置“试一试”演示的方式。 - Anurag

1
FYI,在Java中,它是:
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH);
Date d = sdf.parse(dateAsString);

sdf = new SimpleDateFormat("dd-MM-yyyy");
String s = sdf.format(d);

0

Swift 中:

let dateString = "Fri Apr 09 12:53:54 +0000 2010"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
let date = dateFormatter.date(from: dateString)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接