Подтвердить что ты не робот

Как конвертировать Javascript datetime в С# datetime?

Я читал, что если вы хотите конвертировать из дат JavaScript в даты С#, вы должны использовать getTime(), а затем добавить этот результат в С# DateTime.

Предположим, что у меня есть это время JavaScript:

Date {Tue Jul 12 2011 16:00:00 GMT-0700 (Pacific Daylight Time)}

Он отображает 1310522400000 миллисекунды

var a = new DateTime(1970, 01, 01).AddMilliseconds(1310522400000);

// result
7/13/2011 2:00:00 AM

Так что это неправильно. Я не уверен, что мне нужно делать.

4b9b3361

Ответ 1

Сначала создайте строку в требуемом формате, используя следующие функции в JavaScript

var date = new Date();
var day = date.getDate();       // yields date
var month = date.getMonth() + 1;    // yields month (add one as '.getMonth()' is zero indexed)
var year = date.getFullYear();  // yields year
var hour = date.getHours();     // yields hours 
var minute = date.getMinutes(); // yields minutes
var second = date.getSeconds(); // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

Передайте эту строку функции codebehind и принимайте ее как строковый параметр. Используйте DateTime.ParseExact() в codebehind, чтобы преобразовать эту строку в DateTime следующим образом:

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Надеюсь, что это поможет...

Ответ 2

Вы были почти правы, нужно только одно небольшое исправление:

var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(1310522400000)
    .ToLocalTime();

Ответ 3

Вы можете использовать метод JavaScript toJSON(), он преобразует JavaScript DateTime в то, что С# может распознать как DateTime.

Код JavaScript выглядит следующим образом

var date = new Date();
date.toJSON(); // this is the JavaScript date as a c# DateTime

Ответ 4

DateTime.Parse - намного лучшая ставка. Даты JS и С# не начинаются с одного корня.

Образец:

DateTime dt = DateTime.ParseExact("Tue Jul 12 2011 16:00:00 GMT-0700",
                                  "ddd MMM d yyyy HH:mm:ss tt zzz",
                                  CultureInfo.InvariantCulture);

Ответ 5

Так как я нахожусь в другом часовом поясе, мои JavaScript и С# имеют разницу в 2 часа между той же датой (даже когда я пытался отправить дату в веб-службу в качестве даты [не преобразованной в строку/другой объект]).

Я попытался использовать getTime() в JavaScript и добавить миллисекунды к дате С# (начиная с 1970-01-01), но я всегда получал два часа вперед на дату С#.

Чтобы гарантировать, что я получаю те же Date и Hour в обеих сторонах, я закончил это:

В JavaScript я использовал функцию UTC:

var jsDate = Date.UTC(year,month,day,hours,minutes,seconds,millisec);

И в С# для получения правильного DateTime я сделал это:

var date = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(jsDate);

Надеюсь, что это поможет кому-то.

Ответ 6

Если вы используете moment.js в своем приложении.

var x = moment (new Date()). format ('DD/MM/YYYY hh: mm: ss')

Передайте x функцию codebehind и принимайте ее как строковый параметр. Используйте DateTime.ParseExact() в С# для преобразования этой строки в DateTime следующим образом:

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Ответ 7

Если вы хотите отправить даты в С# из JS, то это на самом деле довольно просто - если отправка дат по UTC приемлема.

var date = new Date("Tue Jul 12 2011 16:00:00 GMT-0700");
var dateStrToSendToServer = date.toISOString();

... отправить в сторону С#...

var success = DateTimeOffset.TryParse(jsISOStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var result);

С# DateTime уже понимает форматы даты ISO и будет анализировать это просто отлично.

Для форматирования из С# в JS просто используйте DateTime.UtcNow.ToString("o").

Лично мне никогда не удобно полагаться на математику и логику между различными средами, чтобы получить миллисекунды/тики для отображения ТОЧНОЙ даты и времени, которые пользователь может видеть на клиенте (особенно там, где это важно). Я бы сделал то же самое при переводе валюты (вместо этого используйте строки, чтобы быть в безопасности, или разделите доллары и центы между двумя разными целыми числами). Отправка даты/времени в виде отдельных значений была бы просто хорошей идеей (см. Принятый ответ).

Ответ 8

Я думаю, вы можете использовать TimeZoneInfo.... для преобразования даты и времени....

    static void Main(string[] args)
    {
        long time = 1310522400000;
        DateTime dt_1970 = new DateTime(1970, 1, 1);
        long tricks_1970 = dt_1970.Ticks;
        long time_tricks = tricks_1970 + time * 10000;
        DateTime dt = new DateTime(time_tricks);

        Console.WriteLine(dt.ToShortDateString()); // result : 7/13
        dt = TimeZoneInfo.ConvertTimeToUtc(dt);

        Console.WriteLine(dt.ToShortDateString());  // result : 7/12
        Console.Read();
    }

Ответ 9

Если вы находитесь в часовом поясе США, то эпоха для вас - 4 часа. 31 декабря 1969. Вы добавили миллисекунды с эпохи к

new DateTime(1970, 01, 01)

который, поскольку у него не был часовой пояс, был интерпретирован как находящийся в вашей временной зоне.

Нет ничего плохого в том, чтобы думать о моментах времени в миллисекундах с эпохи, но понять эпоху - это только 1970-01-01T00: 00: 00Z.

Вы не можете думать о моментах времени, когда они представлены как даты, без часовых поясов.

Ответ 10

JavaScript (HTML5)

function TimeHelper_GetDateAndFormat() {
    var date = new Date();

    return MakeValid(date.getDate()).concat(
        HtmlConstants_FRONT_SLASH,
        MakeValid(date.getMonth() + 1),
        HtmlConstants_FRONT_SLASH,
        MakeValid(date.getFullYear()),
        HtmlConstants_SPACE,
        MakeValid(date.getHours()),
        HtmlConstants_COLON,
        MakeValid(date.getMinutes()),
        HtmlConstants_COLON,
        MakeValid(date.getSeconds()));
}

function MakeValid(timeRegion) {
    return timeRegion !== undefined && timeRegion < 10 ? ("0" + timeRegion).toString() : timeRegion.toString();
}

С#

private const string DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";

public DateTime? JavaScriptDateParse(string dateString)
{
    DateTime date;
    return DateTime.TryParseExact(dateString, DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out date) ? date : null;
}

Ответ 11

В харунском ответе были некоторые ошибки, которые исправлены ниже:

1) дата, когда харун использовал getDay(), который является неправильным, должен быть getDate()

2) getMonth() дает меньше месяца, чем фактический месяц, поэтому мы должны увеличивать его на 1, как показано ниже

var date = new Date();
var day = date.getDate();           // yields 
var month = date.getMonth() + 1;    // yields month
var year = date.getFullYear();      // yields year
var hour = date.getHours();         // yields hours 
var minute = date.getMinutes();     // yields minutes
var second = date.getSeconds();     // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

Передайте эту строку в функцию codebehind и принимайте ее как строковый параметр. Используйте DateTime.ParseExact() в коде для преобразования этой строки в DateTime следующим образом:

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

Это работало для меня! Надеюсь, это тоже поможет вам.

Ответ 12

JS:

 function createDateObj(date) {
            var day = date.getDate();           // yields 
            var month = date.getMonth();    // yields month
            var year = date.getFullYear();      // yields year
            var hour = date.getHours();         // yields hours 
            var minute = date.getMinutes();     // yields minutes
            var second = date.getSeconds();     // yields seconds
            var millisec = date.getMilliseconds();
            var jsDate = Date.UTC(year, month, day, hour, minute, second, millisec);
            return jsDate;
        }

JS:

var oRequirementEval = new Object();
var date = new Date($("#dueDate").val());

CS:

requirementEvaluations.DeadLine = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(Convert.ToDouble( arrayUpdateRequirementEvaluationData["DeadLine"]))
    .ToLocalTime();

Ответ 13

ОБНОВЛЕНИЕ. Из .NET версии 4.6 используйте FromUnixTimeMilliseconds метод DateTimeOffset:

DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime

Ответ 14

Вы также можете отправить Js time на С# с помощью библиотеки Moment.js:

JavaScript: var dateString = moment(new Date()).format('LLLL')

С#: DateTime.Parse(dateString);

Ответ 15

Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();

Ответ 16

Я смог решить проблему, используя решение, указанное @Garth.

date.toJSON()