技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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   codestyle  阅读(1829)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示