我有一个WCF REST服务,有一些方法:
string FooBar(Foo bar);
Foo里面有一个DateTime属性。
另一方面,我有一个Angular.js客户端。客户端调用服务并格式化日期以满足WCF的需要。我使用以下函数来格式化日期:
function dateToWcf(input) {
var d = new Date(input);
if (isNaN(d)) return null;
return '\/Date(' + d.getTime() + '-0000)\/';
}
(来自here)
//Splitted date is a result of .split(".") function executed on input date in dd.MM.yyyy format
model.field = dateToWcf(new Date(splittedDate[2], splittedDate[1], splittedDate[0], 0, 0, 0));
调用的结果是JSON,日期字段表示如下:
/Date(1455318000000-0000)/\
WCF服务绑定日期,但方式不正确。它添加了一个偏移量,因此输入日期与输出日期不同:
13.01.2016 - > 2016年2月13日
31.01.2016 - > 2016年3月2日
我知道它是否略有不同,但是一个月太大而不能成为时区的差异。我知道日期和时间表示是一个很大的主题,但我找不到这种行为的简单答案。
更新
我注意到dateToWcf函数产生了某些奇怪的纪元值。 This在线转换器无法很好地转换它。我已修改为
function dateToWcf2(dateInString, dateFormat) {
return '\/Date(' + moment.utc(dateInString, dateFormat).unix() + ')\/'
}
结果更令人沮丧。它返回正确的纪元时间戳(例如01.01.2016 -> 1451606400
),但WCF完全错误地将其翻译(01.01.2016 -> 17.01.1970
)。
UPDATE2
在时间戳结束时似乎是三个缺失的零:
PS C:\Users\Administrator> (new-object DateTime(1970,1,1,0,0,0,0)).AddMilliseconds(1451606400)
Saturday, January 17, 1970 7:13:26 PM
PS C:\Users\Administrator> (new-object DateTime(1970,1,1,0,0,0,0)).AddMilliseconds(1451606400000)
Friday, January 1, 2016 12:00:00 AM
答案 0 :(得分:0)
问题不是WCF而是java脚本。有各种表示时间戳的方法。将此任何格式的日期从输入转换为WCF可接受的形式的正确方法是此函数:
function convertDateToWCFFormat(dateInString, dateFormat) {
var noTimezone = '-0000';
return '\/Date(' + moment.utc(dateInString, dateFormat).valueOf() + noTimezone + ')\/';
}
答案 1 :(得分:0)
为什么不让你的javascript将DateTime转换为ISO 8601标准。这样你就不必担心时区或任何事情。 WCF处理这种格式就好了!
function dateToWcf(input) {
var d = new Date(input);
if (isNaN(d)) return null;
return d.toISOString(); // ISO 8601 format
}