Как конвертировать 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
Так что это неправильно. Я не уверен, что мне нужно делать.
Ответы
Ответ 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()