Переопределение часов. Теперь время в АД - PullRequest
0 голосов
/ 03 октября 2018

Как переопределить значение DateTime Abp.Timing.Clock?Все проекты используют пакеты NuGet.Я не могу изменить или отредактировать NuGet и выпустить свой собственный nuget.dll, потому что тогда весь проект выдаст «Ошибка, отсутствует ссылка на сборку».Так как именно я могу перемещаться между UTC и Local?

Официальная ссылка говорит о том, что вы можете изменять ВСЕ Clock.Now в глобальном масштабе по всему проекту.Но никогда не указывайте, как изменять на выбор.

Обычно это делается в начале приложения (сделайте это в Application_Start веб-приложения).

А также:

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

Но как насчет ситуаций, когда я хочу извлечь значение из базы данных, которая хранится как UTC , в то время как другие значения Local и наоборот?

Как в чатедемо использует Clock.Now, но не объясняет никакой механики.Если сообщение отправляется в чате в моем локальном 7 утра, будет ли оно отображаться как 7 утра для человека, читающего его на другом конце света?

Создатели говорят:

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

Но весь разговор был о JavaScript, а не о хранении и чтении из базы данных со значениями UTC / Local.

Могу ли я лучшепросто удалить все экземпляры Clock.Now и использовать вместо него DateTime.Now/UTC?Как насчет остальной части сборки NuGet, которая использует Clock.Now?

Часы - это основной класс, используемый для работы со значениями DateTime.Он определяет следующие статические свойства и методы ...

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

Действительно хотелось быеще несколько ресурсов и информации по этому вопросу.Два абзаца текста на самом деле не делают достаточно, чтобы поддержать мои опасения.Мне нужно больше информации о EntityFramework / Database и меньше о JavaScript .


Редактировать в ответ на @ aaron's answer .Я не хотел пытаться втиснуть это в текст комментария.

public ChatMessage(
        UserIdentifier user,
        UserIdentifier targetUser,
        ChatSide side,
        string message,
        ChatMessageReadState readState,
        Guid sharedMessageId,
        ChatMessageReadState receiverReadState)
    {
        UserId = user.UserId;
        TenantId = user.TenantId;
        TargetUserId = targetUser.UserId;
        TargetTenantId = targetUser.TenantId;
        Message = message;
        Side = side;
        ReadState = readState;
        SharedMessageId = sharedMessageId;
        ReceiverReadState = receiverReadState;

        CreationTime = Clock.Now;
    }

Где в этой записи я мог бы изменить, если этот запрос Clock.Now является UTC или локальным?Не затрагивая какой-либо код в другом месте проекта.Clock.Now - это статический метод, а также Clock.Provider.Выбор, который я упоминал ранее, заключался в том, чтобы различать несколько экземпляров записей в базе данных, следуя различным правилам или шаблонам.Не могли бы вы помочь прояснить эту путаницу?Спасибо.

Может быть, для моего Chat я хочу, чтобы все значения DateTime были локальными, но для моей системы входа в систему я хочу, чтобы все значения DateTime были в формате UTC.Как бы я пошел об отделении одного статического Clock.Now от другого?Система часов везде одинакова в коде.Но что, если я хочу, чтобы это было по-другому в определенных местах?Мол, а что если мне нужно локальное время сервера, а не время пользователя?Что, если я хотел бы узнать местное время пользователя, но затем дать им DateTime для другого часового пояса?Что если я захочу записать местное время, но знаю, какое местное я записываюКак мне сделать это для ONE вместо всех?

1 Ответ

0 голосов
/ 03 октября 2018

Как переопределить значение DateTime Abp.Timing.Clock?... Так как же мне переходить от UTC к местному и обратно?

Официальная ссылка гласит, что вы можете изменять ВСЕ Clock.Now в глобальном масштабе по всему проекту.Но никогда не указывайте, как изменять в зависимости от выбора.

Но как быть с ситуациями, когда я хочу извлечь значение из базы данных, которая хранится как UTC, тогда как другие значения являются локальными и наоборот?

Clock.Provider = ClockProviders.Utc;
// Clock.Now is UTC
// DateTime is UTC if unspecified

Clock.Provider = ClockProviders.Local;
// Clock.Now is Local
// DateTime is Local if unspecified

Подобно тому, как в демо-чате используется Clock.Now, но он не объясняет никакой механики.Если сообщение отправляется в чате в моем локальном 7 утра, будет ли оно отображаться как 7 утра для человека, читающего его на другом конце света?

Да, если вы используете ClockProviders.Local.

Мне лучше просто удалить все экземпляры Clock.Now и использовать вместо него DateTime.Now/UTC?Как насчет остальной части сборки nuget, которая использует Clock.Now?

Нет.

Ответы на редактирование

Где в этой записи я быизменить, если этот запрос Clock.Now является UTC или локальным?Не затрагивая какой-либо код в другом месте проекта.Выбор, который я упоминал ранее, заключался в том, чтобы различать несколько экземпляров записей в базе данных, следуя различным правилам или шаблонам.Не могли бы вы помочь прояснить эту путаницу?

Возможно, для моего Chat я хочу, чтобы все значения DateTime были локальными, но для моей системы входа в систему я хочу, чтобы все значения DateTime были в формате UTC.Как бы я пошел об отделении одного статического Clock.Now от другого?Система часов везде одинакова в коде.Но что, если я хочу, чтобы в некоторых местах все было по-другому?

Используйте ClockProviders.*.Now напрямую.

CreationTime = ClockProviders.Local.Now;

Clock.Now для согласованности во всем приложении.

Например, что если мне нужно локальное время сервера, а не время пользователя?Что, если я хотел бы узнать местное время пользователя, но затем дать им DateTime для другого часового пояса?Что, если я хочу записать местное время, но знаю, какое местное i записываю?

ClockProviders.Local.Now - это местное время сервера.Если вам нужно время пользователя или , если вы хотите поддерживать пользователей с несколькими часовыми поясами, вам нужно сохранить настройку часового пояса для пользователей.Таким образом, вы можете использовать эту настройку.

Как мне сделать это для значения ONE вместо всех?

Использовать ClockProviders.*.Now напрямую.

...