2015-04-06 3 views
0

На сервере я использую Yahoo API для получения валюты http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=USDGBP=X,USDEUR=XПреобразовать C# DateTime в МестноеВремя на клиенте (JS)

в результате я получаю 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

взгляните на Datetime.Parse – Alessio

+4

Ну что такое 'data [1] .DateTime' в результате? Вы ничего нам не рассказали о том, как «DateTime» представляется клиенту ... –

+0

Jon, d - результат, который был возвращен, я изменил свой ответ (это объект DateTime). – user829174

ответ

0

Попробуйте это ... Я предполагаю, что Yahoo CSV находится в формате США (m/d/yyyy) ... Если нет, вам необходимо исправить то, как месяц и дата извлекаются в fi xYahooDate ...

(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()); 

}()); 
1

Просто измените код, чтобы правильно сформировать ISO 8601 строку.

var d = new Date(d + "Z"); 

Скриншот из Chrome отладки консоли:

Screenshot

В качестве альтернативы, вы можете обеспечить Z был добавлен код .NET путем удостоверяясь .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 уже будет на месте.

+0

Также стоит отметить, что API не возвращает правильные значения. Я запускал его только сейчас, и у него есть время на полный час перед текущим временем UTC. Я предполагаю, что они переходят из местного часового пояса в UTC на их конце и не учитывают DST в процессе. –

Смежные вопросы