Игнорировать часовой пояс при публикации значения из приложения Angular в. Net Базовый WebAPI - PullRequest
0 голосов
/ 15 апреля 2020

Я отправляю следующее JSON из моего Angular приложения в .Net Core WebAPI:

{CompanyBillingHireRateId: 4, CompanyId: 44, AccountId: null, EquipmentId: 128, EffectiveDate: Sun Dec 29 2019 00:00:00 GMT+0200 (South Africa Standard Time)}

Как видите, значение EffectiveDate выглядит следующим образом: EffectiveDate: Sun Dec 29 2019 00:00:00 GMT+0200 (South Africa Standard Time)

Ниже мой. Net Метод основного контроллера:

[HttpPut("billing/hirerates/update")]
    public async Task<IActionResult> UpdateNewCompanyBillingHireRateAsync([FromBody] CompanyBillingHireRateViewModel model)
    {
        try
        {
            var success = await _companyFacade.UpdateCompanyBillingHireRates_Async(model).ConfigureAwait(false);
            if (success)
                return Created("", success);
            return StatusCode((int)HttpStatusCode.BadRequest);
        }
        catch (CustomException cEx)
        {
            await _customExceptionProcess.ProcessCustomException(cEx).ConfigureAwait(false);
            return StatusCode(cEx.StatusCode, new { Message = cEx.FriendlyMessage ?? "" });
        }
    }

В моем приложении. Net, EffectiveDate принимается как: {2019/12/28 22:00:00 +00:00}

В моем Startup.cs я пытаюсь настроить API на игнорирование часового пояса, сохранить полученное значение даты как есть и преобразовать в соответствующее значение datetime in. Net, но не получилось. Вот мой запуск, конфигурация cs:

services.AddControllers().AddNewtonsoftJson(setup =>
        {
            setup.SerializerSettings.ContractResolver = new DefaultContractResolver();
            setup.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            setup.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
            setup.SerializerSettings.DateParseHandling = Newtonsoft.Json.DateParseHandling.None;
            setup.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
        });

Как настроить API на игнорирование часовых поясов и просто считать значение JSON в виде строки и проанализировать соответствующую дату, полученную из Angular UI?

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете использовать метод toISOString(), который преобразует дату вашего клиента в стандартный формат ISO8601 .

Ваша дата будет выглядеть следующим образом:

new Date().toISOString()
"2020-04-15T12:55:28.344Z"

Где окончание «Z» - это обозначение зоны для нулевого смещения UT C. Как правило, вы всегда должны работать с датами UT C на стороне сервера и позволить клиенту работать со своим часовым поясом (если у вас нет других особых требований).

Если я не понял ваш вопрос, передав дата уже в UT C для сервера должна быть достаточной без смены бэкэнда.


Обновлено

На основании комментария я вижу два возможных в этом случае:

1 - используйте момент. js, который дает вам много методов для анализа и проверки дат. Вы можете выполнить синтаксический анализ даты до UT C на клиенте (ниже приведен фрагмент кода. js docs).

Если вы хотите работать с датой в контексте местного времени пользователя:

moment('2016-01-01T23:35:01'); 
// "2016-01-01T23:35:01-06:00" - UTC offset as the client

Если вы будете sh взаимодействовать с датой в формате UT C , используйте moment.utc:

moment.utc('2016-01-01T23:35:01');
// "2016-01-01T23:35:01+00:00" -  Date with a utc offset of +0:00:

Если вам нужно работать где-то еще с датами, то момент. js может быть полезен, даже если это добавляет дополнительную сверхурочную работу вашему приложению.

2 - Вы можете добавить свойство "только для чтения" в вашей модели, которое возвращает ISOString из вашего свойства данных.

// In xxx.model.ts
get isoStringDate() {
   modelDateProperty.toISOString();
}

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

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