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"
}
posted on 2012-04-03 18:00 codestyle 阅读(1829) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述