在服务器上,我使用Yahoo API来获取货币 http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=USDGBP=X,USDEUR=X
在结果中我得到Date
和Time
,并希望将其转换为DateTime
对象,以便稍后将其转换为客户端的本地时间
我用以下
做到了DateTime d = dateOnly.Add(timeOnly.TimeOfDay);
我现在想在客户端(Javascript)上将其转换为本地时间
我试过了客户端
var d = new Date(d + " UTC");
alert(d.toString());
修改 d值为2015-04-06T12:32:00
但收到错误Invalid Date
答案 0 :(得分:1)
只需更改代码即可正确形成ISO 8601字符串。
var d = new Date(d + "Z");
Chrome调试控制台的屏幕截图:
或者,您可以确保.NET代码添加Z
,确保.Kind
值的DateTime
设置为DateTimeKind.Utc
。
例如:
d = DateTime.SpecifyKind(d, DateTimeKind.Utc);
或者更好的是,您可以将其解析为UTC开始。
string dateOnly = "4/6/2015";
string timeOnly = "11:32pm";
DateTime dt = DateTime.ParseExact(dateOnly + " " + timeOnly,
"M/d/yyyy h:mmtt",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
这可能是最安全的方式。现在这种类型已经是UTC了,Z
已经存在。
答案 1 :(得分:0)
试试这个...我假设雅虎CSV是美国格式( m / d / yyyy )......如果没有,你需要修改月份和日期的提取方式的 fixYahooDate 强> ...
(function() {
'use strict';
String.prototype.pad = function(c, l) {
return (new Array(l + 1).join(c) + this).substr(-l, l);
};
function fixYahooDate(aDate) {
var match = /(\d?\d)\/(\d?\d)\/(\d+)/gi.exec(aDate);
var m = match[1];
var d = match[2];
var y = match[3];
var sm = m.pad('0', 2);
var sd = d.pad('0', 2);
var fixedDate = sm + "/" + sd + "/" + y;
return fixedDate;
}
function fixYahooTime(aTime) {
var match = /(\d?\d):(\d\d)(am|pm)/gi.exec(aTime);
var h = match[1];
var m = match[2];
var a = match[3];
var sh = h.pad('0', 2);
var fixedTime = sh + ":" + m + ":00 " + a + " UTC";
return fixedTime;
}
function YahooDateTimeToLocal(aDate, aTime) {
var s = fixYahooDate(aDate) + " " + fixYahooTime(aTime);
console.log(s);
var dt = new Date(s);
return dt;
}
var aDate = "4/6/2015";
var aTime = "12:29pm";
var localDt = YahooDateTimeToLocal(aDate, aTime);
console.log(localDt.toString());
}());