覆盖时钟。ABP 现在时间

use*_*384 3 c# entity-framework entity-framework-core asp.net-boilerplate aspnetboilerplate

如何覆盖 DateTime 值Abp.Timing.Clock?这些项目都使用 NuGet 包。我无法更改或编辑 NuGet 并发布我自己的个人版本,nuget.dll因为整个项目将给出“错误,缺少程序集引用”。那么我究竟如何在 UTC 和 Local 之间来回呢?

官方链接说您可以Clock.Now在整个项目的全球范围内更改所有内容。但永远不要指定如何在选择的基础上进行更改。

这通常在应用程序开始时完成(在 Web 应用程序的 Application_Start 中完成)。

也:

当使用 EntityFramework 或 NHibernate 模块时,ABP 会根据当前时钟提供程序自动规范从数据库接收的日期时间。

但是,如果我想从数据库中提取一个存储为UTC的值,而其他值是本地值,反之亦然,该怎么办?

就像聊天演示使用的那样Clock.Now,但它没有解释任何机制。如果我本地早上 7 点在聊天中发送一条消息,那么对于世界另一端阅读该消息的人来说,该消息是否会显示为上午 7 点?

创作者说:

...如果您想支持具有多个时区的用户,您需要为用户存储时区设置。因此,您可以使用此设置。

但整个对话都是关于 JavaScript,而不是关于使用 UTC/本地值存储和读取数据库。

我最好删除所有实例Clock.Now并使用DateTime.Now/UTC它吗?正在使用的 NuGet 程序集的其余部分怎么样Clock.Now

Clock 是用于处理 DateTime 值的主类。它定义了以下静态属性和方法...

DateTime.Now因此,我们不使用 ,而是使用Clock.Now,它对其进行了抽象......

真的想要更多关于这方面的资源和信息。这两段文字并不足以支撑我的担忧。我需要更多关于 EntityFramework/Database 的信息,而不是关于JavaScript 的信息


编辑回应@aaron的答案。我不想尝试将其塞入评论文本中。

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;
    }
Run Code Online (Sandbox Code Playgroud)

如果此Clock.Now请求是 UTC 或本地请求,我将修改此条目中的何处?不影响项目中其他地方的任何代码。Clock.Now是一个静态方法,以及Clock.Provider. 我之前提到的选择是为了区分遵循不同规则或模式的数据库条目的多个实例。您能帮忙澄清这个困惑吗?谢谢。

也许对于我来说Chat,我希望所有日期时间值都是本地的,但对于我的登录系统,我希望所有日期时间值都是UTC。我该如何将一种静电与另一种静电分开Clock.Now?代码中各处的时钟系统都是相同的。但如果我希望它在某些地方有所不同怎么办?例如,如果我想要服务器的本地时间而不是用户的时间怎么办?如果我想要用户的本地时间,然后给他们另一个时区的日期时间怎么办?如果我想记录当地时间,但又知道要记录哪个当地时间怎么办?我该如何为一个值而不是所有值做到这一点?

aar*_*ron 5

如何覆盖 DateTime 值Abp.Timing.Clock?...那么我到底如何在 UTC 和 Local 之间来回呢?

官方链接说您可以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
Run Code Online (Sandbox Code Playgroud)

就像聊天演示使用的那样Clock.Now,但它没有解释任何机制。如果我本地早上 7 点在聊天中发送一条消息,那么对于世界另一端阅读该消息的人来说,该消息是否会显示为上午 7 点?

是的,如果您使用ClockProviders.Local.

我最好删除所有实例Clock.Now并使用DateTime.Now/UTC它吗?正在使用的 nuget 组件的其余部分怎么样Clock.Now

不。

回复编辑

如果此 Clock.Now 请求是 UTC 或本地,我将修改此条目中的何处?不影响项目中其他地方的任何代码。我之前提到的选择是为了区分遵循不同规则或模式的数据库条目的多个实例。您能帮忙澄清这个困惑吗?

也许对于我来说Chat,我希望所有日期时间值都是本地的,但对于我的登录系统,我希望所有日期时间值都是UTC。我该如何将一种静电与另一种静电分开Clock.Now?代码中各处的时钟系统都是相同的。但如果我希望它在某些地方有所不同怎么办?

ClockProviders.*.Now直接使用。

CreationTime = ClockProviders.Local.Now;
Run Code Online (Sandbox Code Playgroud)

Clock.Now是为了应用程序范围内的一致性。

例如,如果我想要服务器的本地时间而不是用户的时间怎么办?如果我想要用户的本地时间,然后给他们另一个时区的日期时间怎么办?如果我想记录当地时间,但又知道要记录哪个当地时间怎么办?

ClockProviders.Local.Now是服务器的本地时间。如果您想要用户的时间或者想要支持具有多个时区的用户,则需要存储用户的时区设置。因此,您可以使用此设置。

我该如何为一个值而不是所有值做到这一点?

ClockProviders.*.Now直接使用。