2016-05-02 3 views
0

Я использую момент, чтобы преобразовать строку даты в объект даты, а затем получить миллисекунды этой даты и передать ее на сервер в виде строки запроса . Проблемы состоят в том, что миллисекунды Я получаю от JavaScript, когда я пытаюсь преобразовать его в DateTime в C# она всегда дает мне другую датуПолучить правильную дату в миллисекундах От Javascript до C#

Javascript

function RedirectToOptions() { 
    var iBranchId = $('#ddl_Branches').val(); 
    var strDate = $('#txt_datepicker').val(); 
    var dtDate = moment(strDate); 
    var iDate = dtDate.toDate().getTime(); 
    var capitalActionUrl = '@Html.Raw(@Url.Action("Revenue", new {BranchId = "_id_", DateTimeStamp = "_date_" }))'; 
    var branchCapitalUrl = capitalActionUrl.replace("_id_", iBranchId); 
    var branchCapitalUrl = branchCapitalUrl.replace("_date_", iDate); 
    window.location.replace(branchCapitalUrl); 
} 

C#

public ActionResult Revenue(int? BranchId, double? DateTimeStamp) 
{ 
    DateTime? date = (DateTimeStamp.HasValue) ? (DateTime?)DateTimeConverter.FromUnixToDateTime(DateTimeStamp.Value) : null; 
    IEnumerable<RevenueDTO> revenueDTO = _Client.GetRevenue(BranchId, date); 
    IEnumerable<RevenueViewModel> revenue = ViewModelConverter.RevenueDTOToRevenueViewModel(revenueDTO); 

    List<BranchDTO> branchesDTO = _Client.GetAllBranches().ToList(); 
    var branches = ViewModelConverter.BranchDTOToBranchesViewModelList(branchesDTO); 
    ViewBag.Branches = branches; 

    return View(revenue); 
} 

Преобразование даты времени

public static DateTime FromUnixToDateTime(double UnixTimeStamp) 
{ 
    DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); 
    dateTime = dateTime.AddMilliseconds(UnixTimeStamp); 
    return dateTime; 
} 

когда я пытаюсь передать 1/5/2016 (дд/мм/гггг отформатирован), когда я преобразовать его, он становится 1/4/2016 по какой-то причине

+0

С одной стороны, 'typeof iDate == 'Nan'' всегда будет' false'. 'typeof NaN' - это' 'number" '. Что вы ищете, это 'iDate = isNaN (iDate)? null: iDate; ' –

+0

*", когда я пытаюсь передать 1/5/2016 (dd/MM/yyyy formatted), когда я его конвертирую, по какой-то причине становится 1/4/2016 ». * Как вы это проверяете? –

ответ

2

Существует лучший способ передать объект даты на C# и использовать обычный стандартный ISO 8601 формат (например, 2016-01-01T12: 00: 00.568Z). Если вы вызываете toJSON() в свою дату, связующее на C# должно автоматически преобразовывать его в дату и время C# с соответствующим часовым поясом.

Вы сможете увидеть, нет ли у вас рассогласования timzeone с миллисекундами в javascript, а также с необработанным миллисекундным номером.

Вы можете прочитать больше об этом here.

0

Если вы используете эпоху, то убедитесь, что все ваши временные зоны установлены в UTC (и конвертировать в местные впоследствии) ... в Javascript:

// ... 
var dtDate = moment.utc(strDate); 
// ... 

и в C#:

// ... 
DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
// ... 
+0

На стороне JavaScript это совершенно не имеет значения, и на самом деле 'moment.utc (...)' может быть вредным. Число, которое вы получаете из 'Date # getTime', - это число миллисекунд с 1 января 1970 года в полночь ** UTC **, всегда. Использование 'moment.utc (...)', вероятно, закончится тем, что даёт неверную дату, поскольку я предполагаю, что пользователь хочет разобрать в локальное время. Однако сторона C#, скорее всего, полезна. Я не думаю, что это проблема OP, но превращая миллисекунды с тех пор в Epoch в «DateTime», они определенно хотят начать с UTC 'DateTime', хороший улов. –

+0

@TJCrowder да, но он преобразуется из строки, которая, вероятно, находится в локальном режиме, а не указывая, есть она или нет ... в моем браузере (UTC + 2 local), 'moment (" 2016-05-01 ") .toDate(). getTime() 'дает' 1462053600000', а 'moment.utc (« 2016-05-01 »). toDate(). getTime()' дает '1462060800000' ... достаточно разницы, чтобы вернуться один день (пару часов, но с тех пор, как эпоха в полночь, она идет накануне) при обращении обратно в C# – Jcl

+1

OP должен был бы рассказать нам, хотят ли они разобрать его локально; Я уверен, что они это делают. Но обратите внимание, что разница OP не один день, это один ** месяц **. –

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