文档章节

【经验分享】为什么后台取到的时间和前台差8个小时?

o
 osc_a22drz29
发布于 2019/03/21 15:36
字数 963
阅读 3
收藏 0

精选30+云产品,助力企业轻松上云!>>>

发现问题

单元格编辑时,你可能会遇到前台传入的时间,后台通过C#获取时差8个小时,这是怎么回事呢?

 

这个问题可能会困扰一些同学,我也不止一次的收到这样的问题,这个是昨天一个网友的提问:

 

之前还有网友在发表类似的问题:

 

为了演示这一过程,我通过一个简单的例子来说明问题,首先新建一个页面:

@(F.DatePicker().DateFormatString("yyyy-MM-dd HH:mm:ss").Label("开始日期").ID("DatePicker1").ShowTime(true).SelectedDate(DateTime.Now))
@(F.Button().ID("btnSubmit").Text("提交表单").OnClick(Url.Action("btnSubmit_Click"), "DatePicker1"))

@(F.Label().ID("labResult"))

 

后台代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnSubmit_Click(FormCollection values)
{
    UIHelper.Label("labResult").Text("开始日期:" + values["DatePicker1"]);

    return UIHelper.Result();
}

 

因为后台直接从请求表单中读取的字符串,所以没有问题,前台参数传入:

DatePicker1: 2019-03-21 14:48:55

 

页面上显示:

开始日期:2019-03-21 14:48:55


现在前台新增一个按钮,并通过自定义回发的形式传入后台:

@(F.Button().ID("btnSubmit2").Text("自定义回发").OnClientClick("btnSubmit2Click();"))

function btnSubmit2Click() {
    F.doPostBack('@Url.Action("btnSubmit2_Click")', {
        values: F.toJSON({
        DatePicker1: F.ui.DatePicker1.getValue()
        })
    });
}

 

后台直接从JSON对象中读取数据,并显示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnSubmit2_Click(JObject values)
{
    UIHelper.Label("labResult").Text("开始日期:" + values["DatePicker1"].ToString());

    return UIHelper.Result();
}

 

此时再看回发后的前台显示:

开始日期:2019/3/21 6:45:44

 

好嘛!刚好差8个小时,逮个正着!

 

分析问题

可能有人会说了,是不是前台传入的数据有误?其实不是的,打开浏览器调试工具,看下传入的参数:

values: {"DatePicker1":"2019-03-21T06:48:55.000Z"}

 

可以发现,前台 F.toJSON 之后,原来的字符串 2019-03-21 14:48:55 被转化为标准时间:2019-03-21T06:48:55.000Z

这个转化是没问题的,因为它(2019-03-21T06:48:55.000Z)描述的是标准零时区的时间,和我们的本地时间(北京时间,东八区)刚好差了8个小时。

 

问题出在后台JSON格式转化,JSON.NET会识别含有类似 2019-03-21T06:48:55.000Z 的字符串,并将之转化为时间格式!!

在VS中调试,可以看到 values["DatePicker1"] 其实是 Date 类型,并非我们所期望的 string 类型:

 

解决问题

其实这个时间对象也没问题,只不过它表示的是标准零时区时间,我们只需将其转化为本地时间就可以了,所以正确的代码应该是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnSubmit2_Click(JObject values)
{
    UIHelper.Label("labResult").Text("开始日期:" + values.Value<DateTime>("DatePicker1").ToLocalTime().ToString());

    return UIHelper.Result();
}

 

现在前台显示:

开始日期:2019/3/21 14:48:55


还可以将字符串格式化为需要的格式:

UIHelper.Label("labResult").Text("开始日期:" + values.Value<DateTime>("DatePicker1").ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));

 


此时前台显示:

开始日期:2019-03-21 14:48:55

 

 

深入问题

还有观众说了,JSON.NET的这个自动转化我不需要,能不能直接拿到这个字符串,然后我自己通过 DateTime.Parse 来转换呢?

我在网上搜索了一下,发现如下两个解决办法,供参考:

办法一:

JsonReader reader = new JsonTextReader(new StringReader(values.ToString()));
reader.DateParseHandling = DateParseHandling.None;
JObject o = JObject.Load(reader);
// 2019/3/21 14:48:55
var result1 = DateTime.Parse(o.Value<string>("DatePicker1")).ToString();

 

办法二:

JsonSerializerSettings settings = new JsonSerializerSettings()
{
    DateParseHandling = DateParseHandling.None
};
JObject j2 = JsonConvert.DeserializeObject<JObject>(values.ToString(), settings);

 

说白了就是告诉 JSON.NET,不要自作主张的帮我把字符串转换为日期对象(DateParseHandling.None),我要取得原始的字符串。

 

并且由于上面需要把 values 先转换为字符串,既然如此,还不如直接使用 string 来接受参数(少了一次参数自动类型转换和一次强制类型转换):

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnSubmit2_Click(string values)
{
    JsonSerializerSettings settings = new JsonSerializerSettings()
    {
        DateParseHandling = DateParseHandling.None
    };
    JObject j2 = JsonConvert.DeserializeObject<JObject>(values, settings);

    return UIHelper.Result();
}

 

只不过这个路子绕的有点远。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
springboot后端时间到前端,相差8小时,时间格式不对

spring boot后台时间正确,返回给前台的时间不正确,和后台差8个小时 原因是: spring-boot中对于@RestController或者@Controller+@ResponseBody注解的接口方法的返回值默认是Json格式, 所以...

osc_z7893gdn
01/29
12
0
flash开发中rubyamf的时间问题

在flex开发中rubyamf的时间问题? 从flex前台往ruby后台写时间会少8个小时,用的是rubyamf。例如,在flex前台2014-01-01 08:00:00用rubyamf传到后台就会变成2014-01-01 00:00:00,同样后台2...

liyang1069
2014/07/06
120
0
Lua游戏开发之时区问题

目前大部分游戏都采用了Lua语言进行功能开发,在进行多语种发行的时候就会遇到时区显示的问题。以韩国版本为例,场景如下: 1、服务器处于固定的位置,比如放在首尔机房; 2、玩家所处的位置...

meteoric_cry
2018/09/12
0
0
Lua游戏开发之时区问题

转自:https://www.cnblogs.com/meteoriccry/p/9637040.html 目前大部分游戏都采用了Lua语言进行功能开发,在进行多语种发行的时候就会遇到时区显示的问题。以韩国版本为例,场景如下: 1、服...

Bill Yuan
2019/12/09
0
0
认知感悟和升级

1.思考脑和反射脑 有科学研究发现,一个人一天的行为当中: 5%是非习惯性的,用思考脑的逻辑驱动 95%是习惯性的,用反射脑的直觉驱动。 但是,决定我们一生的: 永远是那95%的反射脑(习惯),...

双月通天
02/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

macz技巧分享—macOS高端使用技巧

Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不...

mac小叮当
22分钟前
11
0
手把手教你如何用黑白显示器显示彩色!

来源:大数据文摘 本文约1000字,建议阅读6分钟。 本文为你介绍如何通过黑白显示器上也能显示出彩色。 原来在黑白显示器上也能显示出彩色啊!通过在监视器上覆盖拜耳滤色镜,并拼接彩色图像,...

osc_jklrr90y
22分钟前
13
0
key-value结构排序:给定一个字符串,统计每个字符出现频率,先按value降序,再按key升序

对于key-value结构的排序 第一种:lambda表达式 第二种:函数 第三种:类对()的重载,仿函数形式 #include <iostream>#include <vector>#include <unordered_map>#include <string>#in......

osc_gwtkg2dc
23分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》 目录 世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球...

osc_vew1u0h0
24分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三) 目录 2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》 演讲嘉宾 演讲内容 ...

osc_8o71811p
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部