时间戳的问题
我们的微博应用的一个忽略了很久的问题就是日间和日期的显示。
直到现在,我们在我们的User和Post对象中使用Python它自己的方式来渲染时间对象,但这并不是一个好的解决方案。
考虑下这样的例子。我正在写这篇文章,此时正是12月31号下午3:54。我的时区是PST(或者你们更习惯的:UTC-8)。 在Python解释器中运行,我得到下面输出:
>>> from datetime import datetime
>>> now = datetime.now()
>>> print now
2012-12-31 15:54:42.915204
>>> now = datetime.utcnow()
>>> print now
2012-12-31 23:55:13.635874
在我所在的地方,now()方法返回了正确的时间,但是now()调用返回的时间是UTC单位。
那么,使用哪个更好呢?
如果我们用now(),所有数据库里的时间戳将会与服务器运行的当地时间一致,这将会产生一些问题。
比如,如果有一天,我们需要将服务器放到别的地方(不在一个时区),那么在重启服务器之前,数据库里的时间都需要更新到与新地点保持一致。
还会有更为重要的问题。不同时区的用户将会很难知道什么时候发送邮件,如果用户看到的是PST时区的时间,他们就很难知道邮件是什么时候发送的,这就需要用户根据这个时间做相应的调整。
很显然这不是一个好的选择,这也是我们为什么在创建数据库时就使用UTC时区保存时间戳。
在标准化时间戳为UTC时,解决了移动服务器的问题。但是他不能解决第二个问题,数据和时间在世界上不同地方使用UTC展现给用户。
假设一个用户在PST时区下午3点发送了一封邮件,这封邮件立刻显示在他面前,上面写着11:00pm,或者更具体点(23:00)。
我写这个文章的目的也就是让我们的用户不再因为数据和时间的显示而困惑。
使用具体的时间戳
通常的解决方法是,每一个用户都从UTC转化到当地的时间。这就需要我们动态变化,从而使数据库的UTC与之保持一致。
但是我们怎么知道用户在哪呢?
许多网站都有一个设置页面设置他们的时区。这就需要我们添加一个新的页面,并在表单上提供下拉框让用户选择时区,用户第一次登录的时候需要设置时区,并把它作为注册的一部分。
这是一个正常的解决方法,但是这对于用户来说有点累赘,用户需要输入一条他们已经在操作系统中配置过的信息。所以如果我们能抓取到用户电脑里设置的时区那解决问题会变得更有效率。
出于安全因素,浏览器不允许我们进入用户操作系统获取信息。即使它允许,我们也得知道在Windows,Linux,Mac,iOS,Android中从哪儿能获得到时区,这还不包括其他非主流操作系统。
在浏览器中得到用户的时区,然后通过标准的Javascript API获取到。在Web 2.0世界中用户允许Javascript执行(很少有网站不使用Javascript),所以通过Javascript获取用户时区是可行的。
我们用Javascript有两种方式配置可用的时区:
老派的做法:当用户第一次登录服务器时让浏览器以某种方式发送时区信息给我们。这个可以通过[Ajax](http://en.wikipedia.org/wiki/Ajax_%28programming%29)调用,或者更简单的通过[meta refresh tag](http://en.wikipedia.org/wiki/Meta_refresh)来实现。一旦服务器知道了时区信息,它就能保存它在用户session中,然后调整所有页面的时间显示。
新派的做法:不改变服务器端的任何东西,但仍然会发送UTC时间戳到客户端浏览器。转换UTC到本地时间的工作通过Javascript在客户端执行。
两种方法都是有效的,但第二种更有优势一点。浏览器能依照系统本地配置最好滴完成时间转换。像上午/下午 vs 24小时制,日/月/年 vs 月/日/年 还有其他各种文化的格式,这些格式都是浏览器可访问的,但服务器就不一定了。
如果这些还不够,那新派的做法还有一个更大的优势,而且别人已经为我们做了这件事(moment.js要登场了)!
moment.js简介
Moment.js 是一个小、免费、开源的Javascript库,它将日期和事件提升到另一个等级。它提供了能想象到的所有的时间日期格式,下面就是一些。
要在我们的应用中使用moment.js就需要在我们的模板文件中写那么一丢丢的Javascript代码。我们先来通过ISO 8601 时间来创建一个moment对象。例如:通过上面Python例子的UTC时间来创建一个moment对象,就像这样:
moment("2012-12-31T23:55:13 Z")
一旦对象被创建,它就可以被转化成各种各样格式类型的string。例如,将一个灰常冗长的时间显示转换为本地系统的时间:
moment("2012-12-31T23:55:13 Z").format('LLLL');
下面就是转换以后的时间显示:
Tuesday, January 1 2013 7:55 AM
这儿有更多的例子将同样的时间戳转化为不同的格式:
这个类库对转化选项的支持不止这些。除了format()之外,它还提供了fromNow()和calendar()这些更友好的时间戳转化方法:
注意上面所有的例子中服务器转换相同的UTC时间,而你自己的本地浏览器则会转换不同的时间。
最后我们补上漏掉的一点Javascript小技巧,在页面中显而易见的是,代码实际上由moment返回了string类型。最简单的完成方式是用Javascript的document.write方法:
<script>
document.write(moment("2012-12-31T23:55:13 Z").format('LLLL'));
</script>
通过使用Javascript的document.write是灰常简单和直接的方式来生成一部分HTML代码,然而需要注意的是这种方式有一些限制。最需要主义的一点就是document.write方法只能在document被加载时使用,当document加载完成后,它便不能修改document了。这个限制的结果就是当通过 Ajax 来加载数据时这种解决方案就失效了。
整合moment.js
这儿我们需要做一点点事把moment.js添加到我们的微博客中.
首先,我们需要下载moment.min.js这个库到/app/static/js这个文件夹中,这样它就可以作为静态文件为客户端服务。
然后我们在我们的模板文件(fileapp/templates/base.html)中添加这个库(moment.min.js)的引用:
<script src="/static/js/moment.min.js"></script>
现在我们可以在模板文件中添加
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。