Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 日期转换:从LINQ到JSON再到Javascript_C#_Javascript_Json_Datetime_Formatting - Fatal编程技术网

C# 日期转换:从LINQ到JSON再到Javascript

C# 日期转换:从LINQ到JSON再到Javascript,c#,javascript,json,datetime,formatting,C#,Javascript,Json,Datetime,Formatting,简而言之,在我的API控制器和使用结果的Javascript之间,日期被转换为一个日期 我的问题是,有人建议我在哪里以及如何修复这条长链 步骤1:使用LINQ从数据库检索对象 在这里做任何改变似乎都是不合理的。该模型指定了一个DateTime字段,因此我们实际上没有与字符串进行任何交互 步骤2:API控制器发送响应 我可以在这里指定如何解析日期吗?甚至在服务器端进行处理都有意义吗?我想我可以遍历所有对象并手动设置它们,如下所示: for (var i = 0; i < points.Co

简而言之,在我的API控制器和使用结果的Javascript之间,日期被转换为一个日期

我的问题是,有人建议我在哪里以及如何修复这条长链

步骤1:使用LINQ从数据库检索对象

在这里做任何改变似乎都是不合理的。该模型指定了一个DateTime字段,因此我们实际上没有与字符串进行任何交互

步骤2:API控制器发送响应

我可以在这里指定如何解析日期吗?甚至在服务器端进行处理都有意义吗?我想我可以遍历所有对象并手动设置它们,如下所示:

 for (var i = 0; i < points.Count(); i++ )
 {
     points.ElementAt(i).EarnedOn =  points.ElementAt(i).EarnedOn.ToUniversalTime();
 }

如何将.Net中的日期时间转换为时间戳/秒。JavaScript中到日期对象的转换。不过,我还没有在移动浏览器上测试过它,所以不能保证它100%都能工作

DateTime myDateTime = new DateTime(2012, 01, 17, 9, 30, 0);

long ticks = (myDateTime - DateTime.Parse("01/01/1970 00:00:00")).Ticks;
ticks /= 10000000; //Convert ticks to seconds
var timestamp = ticks.ToString();
然后在JavaScript中,类似

secsToTime = function(theSecs)
{
    var date = new Date(theSecs*1000);
    // hours part from the timestamp

    var hours = date.getHours();
    // minutes part from the timestamp
    var minutes = date.getMinutes();
    // seconds part from the timestamp
    var seconds = date.getSeconds();

    // will display time in 10:30:23 format
    var formattedTime = hours + ':' + minutes + ':' + seconds;
    alert(formattedTime);
}

secsToTime(1326792600);

我最初说我会使用Date.js,但谷歌搜索显示,自2007年以来,Date.js就再也没有提交过,而且还存在很多漏洞。除此之外,它只是工作不太正常

到目前为止,我已经厌倦了寻找合适的解决方案,并在第3步中使用了下面的Javascript代码


这真的很难看,但这是一个答案,所以我把它放在这里。我真的希望有人能来找比这更优雅的东西。

这似乎很奇怪。您的目标浏览器是什么,JSON实际上是什么样子的?你能把它贴出来吗?至少日期表示。@aquinas更新了“我的问题”以回答您的问题,这表明只有更新的浏览器才能识别所讨论的格式,这可能是这里的问题所在。他忽略了在列表上显示移动浏览器,可能需要检查-注意日期文字末尾的尾随Z。看起来你可能也必须这么做。从技术上来说,我喜欢这个解决方案,因为它不会留下任何误解的余地,但我在哪里可以这样做呢?在我从LINQ那里拿到名单之后?我觉得再重复一遍这个列表很傻,但是如果LINQ本身没有办法做到这一点,我想我没有选择了系统的架构是什么?是实体框架吗?在将模型返回给客户端之前,是否将其转换为ViewModel?我使用的是实体框架,但我不倾向于将ViewModels用于API JSON请求。这种做法不好吗?在我的原始帖子的第2步中,你可以看到我发送请求的方式,这实际上取决于需求,例如,你可能有无法传输给客户的敏感数据。通常,我使用AutoMapper将视图模型投影到视图中,以减少发送到客户端的数据量。或者,如果希望保持原样,则在模型中有一个额外的属性,而不是映射到EF,该属性是一个以秒为单位的字符串,并使用循环更新该属性,然后将其用于客户端。
var points = JSON.parse(response);
for(i = 0; i < points.length; i++){
    var date = Date.parse(points[i].EarnedOn);
"EarnedOn":"2012-05-10T00:00:00" 
DateTime myDateTime = new DateTime(2012, 01, 17, 9, 30, 0);

long ticks = (myDateTime - DateTime.Parse("01/01/1970 00:00:00")).Ticks;
ticks /= 10000000; //Convert ticks to seconds
var timestamp = ticks.ToString();
secsToTime = function(theSecs)
{
    var date = new Date(theSecs*1000);
    // hours part from the timestamp

    var hours = date.getHours();
    // minutes part from the timestamp
    var minutes = date.getMinutes();
    // seconds part from the timestamp
    var seconds = date.getSeconds();

    // will display time in 10:30:23 format
    var formattedTime = hours + ':' + minutes + ':' + seconds;
    alert(formattedTime);
}

secsToTime(1326792600);
function parseDate(date){
    var year = parseInt(date.substring(0,4));
    var month = parseInt(date.substring(5,7));
    var day = parseInt(date.substring(8,10));
    var hour = parseInt(date.substring(11,13));
    var minute = parseInt(date.substring(14,16));
    var second = parseInt(date.substring(17,19));
    return new Date(year, month, day, hour, minute, second);
}

for(i = 0; i < points.length; i++){
    var date = Date.parse(points[i].EarnedOn);
    ...