MySQL的datetime类型在web端生成javascript的Date对象

服务端读取Comment表并将结果集返回给调用者,调用者使用json.dumps将结果集转成json字符串列表返回给WEB前端。datetime字段dumps之后变成描述日期的字符串,例如'2012-4-1 12:31:01' JS无法操作这个日期,例如在该时间的基础上加减N天或者N个小时,再比如对两个时间进行比较。找出较早的时间,所以服务端先把datetime转成bigint,再传给客户端(如果是日期是MYSQL的timestamp类型就不需要转换,因为timestamp就是bigint)

#webpy框架
import web,time,datetime
def getList(self,db,noteId):
try:
sql = "SELECT * FROM Comment where noteId=$noteId"
rs = db.query(sql,vars=locals()).list()
for r in rs:
if r.postTime == None:
r.postTime = 0
continue
r.postTime = int(time.mktime(r.postTime.timetuple()))
d = time.localtime(r.postTime)
s = time.strftime('%Y-%m-%d %H:%M:%S', d)
return rs
except:
raise

 

JS的Date对象构造函数有多个重载版本,有一个版本可以根据int类型描述的时间生成Date对象(自1970年以来的微秒数,0就是1970-1-1 08:00:00 0000),不过datetime存的是1970以后的秒数,因此初始化时还需要*1000

服务端使用的时间是标准时区,客户端还需要根据本地时区对服务端的时间做矫正,例如北京时间的10:00提交了一个评论到服务器,这个时间是标准时间的02:00,所以服务器存的也是02:00,从服务器直接读回来就不是用户提交时的本地时间,用户就会觉得奇怪,因此WEB端使用JS去读取用户时区,根据用户所在时区和标准时区的差来矫正结果,例如北京时间就需要在数据库时间上+8个小时,还原到用户提交时的本地时间。

/*
JavaScript允许通过prototype扩展标准库对象的方法,该函数就是给Date对象增加一个format方法,该方法根据用户的参数描述的时间格式返回一个字符串
var d = new Date();
s=d.format("yyyy-MM-dd HH:mm:ss");
alert(s);
*/

Date.prototype.format=function(fmt) {
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //
"h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
"H+" : this.getHours(), //小时
"m+" : this.getMinutes(), //
"s+" : this.getSeconds(), //
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
var week = {
"0" : "\u65e5",
"1" : "\u4e00",
"2" : "\u4e8c",
"3" : "\u4e09",
"4" : "\u56db",
"5" : "\u4e94",
"6" : "\u516d"
};
if(/(y+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
if(/(E+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "\u661f\u671f" : "\u5468") : "")+week[this.getDay()+""]);
}
for(var k in o){
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}


function convertUTCTolocalTime(serverTime)
{
var d = new Date();
//getTimezoneOffset()可以取得JS运行环境的时区和标准时区的分钟差
var localZone = d.getTimezoneOffset();
serverTime = parseInt(serverTime)
if(serverTime == 0)
return ""

if(localZone == 0)
{
//服务器存的时间是秒需要*1000变成微秒
return new Date(parseInt(serverTime)*1000).format("yyyy-MM-dd HH:mm:ss")
}

if(localZone < 0)
{
localZone = Math.abs(localZone);
localTime = new Date(parseInt(serverTime)*1000).valueOf();
//标准时间 + (1000 * 60 是1分钟 * 偏差分钟数) == JS环境的本地时间
localTime = localTime + (1000 * 60 * localZone);
return new Date(localTime).format("yyyy-MM-dd HH:mm:ss")
}

if(localZone > 0)
{
localZone = Math.abs(localZone);
localTime = new Date(parseInt(serverTime)*1000).valueOf();
//标准时间 - (1000 * 60 是1分钟 * 偏差分钟数) == JS环境的本地时间
localTime = localTime - (1000 * 60 * localZone);
return new Date(localTime).format("yyyy-MM-dd HH:mm:ss")
}

return "tntime.js: convertUTCTolocalTime has error"
}



 



转载于:https://www.cnblogs.com/code-style/archive/2012/04/03/2431144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值