Конвертировать DateTime в целое число - PullRequest
0 голосов
/ 07 марта 2019

пока я пытаюсь преобразовать DateTime в тип int, я получаю значение смещения часового пояса как 0 в методе веб-API, которое имеет значение в контроллере как сегодняшнее время даты, которое назначено типу переменной в контроллере, ноAPI ожидает int.

Контроллер

public async Task<ActionResult> Links()
{
    var timezoneOffsetValue = DateTimeOffset.Now.Offset;
    string requestUri = string.Empty;
    UserViewModel user = GetUser();

    if (user != null)
    {
        requestUri = string.Format("api/Link/getLinks/{0}", 
                                   user.TenantId, timezoneOffsetValue);
    }

    string response = await HttpClientHelper.Get(requestUri);
    response = JsonConvert.DeserializeObject<string>(response);
    List<ViewModel> tagList = JsonConvert.DeserializeObject<List<ViewModel>>(response);

    return View(tagList);
}

Web API

public async Task<string> GetTagsAsync(string tenantId,int timezoneOffsetValue)
{
    try
    {
        double offsetDifference = -1 * timezoneOffsetValue;
        string dateFormat = "MM/dd/yyyy HH:mm";
        var dbInfo = await LookupConnectionByTenantId(tenantId, "");
        var result = await resourceTaggingRepository.GetTagsAsync(dbInfo);
        var Tags = JsonConvert.DeserializeObject<List<Tag>>(result);
        foreach (var t in Tags)
        {
            t.CreatedDate = DateTime.Parse(t.CreatedDate).AddMinutes(offsetDifference)
                                    .ToString(dateFormat, CultureInfo.InvariantCulture);

        }
        return JsonConvert.SerializeObject(Tags);               
    }
    catch (Exception ex)
    {
        return " ";
    }
}

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Вы можете получить информацию о текущем часовом поясе, используя TimeZoneInfo, а затем получить общее количество минут от TimeSpan, например,

TimeSpan ts = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);

Например, если ваш текущий часовой пояс Индия , тогда вы получите 5 часов и 30 минут с кодом выше

Выход:

enter image description here

И затем, если вы хотите этот компонент времени в минутах, вы можете использовать TotalMinutes свойство TimeSpan вроде

double totalMinutes = ts.TotalMinutes;

Так что выше totalMinutes дает вам 330 минут, это означает, что ваш часовой пояс Индии на 330 минут вперед от UTC

Или, если вы хотите указать конкретный часовой пояс, вы можете получить его как

TimeZoneInfo cst = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
TimeSpan ts = cst.GetUtcOffset(DateTime.Now);

Так что выше TimeSpan дает вам смещение от часового пояса CST

0 голосов
/ 07 марта 2019

Если вы можете установить какое-то базовое время, вы можете преобразовать DateTime.Ticks в целочисленное представление.

Просто предупреждение: DateTime.Ticks имеет тип Int64 (long), который нельзя сжать вInt32 (int), поэтому вам нужно будет решить, какой уровень точности вы хотите (минуты, дни и т. д.), а затем избавиться от ненужного компонента, чтобы вписать число в целое число.

Цитироватьдокументация: Если базовое время было 14 декабря 2007 г., в 15:23, число тиков с начала XXI века было бы:

  • 219 338 580 000 000 000 наносекунд (не вписывается вцелое число)
  • 3 655 643,00 минуты (это будет соответствовать!)

Для получения дополнительной информации см. документацию для DateTime.Ticks Здесь они используют TimeSpan, чтобы получить толькосекунд.

long elapsedTicks = currentDate.Ticks - centuryBegin.Ticks;
TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
Console.WriteLine("   {0:N2} minutes", elapsedSpan.TotalMinutes);
// 3,655,643.00 minutes
0 голосов
/ 07 марта 2019

DateTimeOffset.Now.Offset относится к типу TimeSpan и не может быть приведено к int. См. ссылка MSDN .

...