覆盖时钟。现在是ABP时间

时间:2018-10-03 15:48:08

标签: c# entity-framework entity-framework-core aspnetboilerplate asp.net-boilerplate

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

official link说,您可以在整个项目的全局范围内更改所有Clock.Now。但是永远不要指定如何进行选择的改变。

  

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

以及:

  

使用EntityFramework或NHibernate模块时,ABP会根据当前时钟提供程序自动归一化从数据库接收的DateTime。

但是如果我想从存储为 UTC 的数据库中提取一个值而其他值是 Local ,反之亦然呢?

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

Creators say:

  

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

但是整个讨论都是关于JavaScript的,与关于使用UTC / Local值存储和读取数据库无关。

我是否最好仅删除Clock.Now的所有实例并改用DateTime.Now/UTC?其余使用Clock.Now的NuGet程序集又如何呢?

  

时钟是用于处理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.NowClock.Provider都是静态方法。我前面提到的选择是为了区分遵循不同规则或模式的数据库条目的多个实例。您能帮忙澄清一下这种混乱吗?谢谢。

也许对于我的Chat我希望所有DateTime值都为Local,但是对于我的登录系统,我希望所有DateTime值都为UTC。如何将一个静态Clock.Now与另一个静态{{1}}分开?时钟系统在代码中到处都是相同的。但是,如果我希望在某些地方有所不同怎么办?就像,如果我要服务器的本地时间而不是用户的时间怎么办?如果我想要用户的本地时间,然后给他们另一个时区的DateTime怎么办?如果我想记录本地时间但是知道我记录哪个本地时间怎么办?如何以一个值而不是全部来做到这一点?

1 个答案:

答案 0 :(得分:4)

  

如何覆盖Abp.Timing.Clock的DateTime值? ...那么我如何在UTC和本地之间来回切换?

     

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

     

但是,在我想从存储为UTC的数据库中提取一个值而其他值是Local且反之亦然的情况下呢?

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?其余使用Clock.Now的nuget程序集又如何呢?

否。

响应编辑

  

如果Clock.Now请求是UTC还是Local,我将在该条目的哪里修改?在不影响项目其他任何代码的情况下。我前面提到的选择是为了区分遵循不同规则或模式的数据库条目的多个实例。您能帮忙澄清一下这种混乱吗?

     

也许对于我的Chat我希望所有DateTime值都为Local,但是对于我的登录系统,我希望所有DateTime值都为UTC。如何将一个静态Clock.Now与另一个静态ClockProviders.*.Now分开?时钟系统在代码中到处都是相同的。但是,如果我希望在某些地方有所不同怎么办?

直接使用CreationTime = ClockProviders.Local.Now;

Clock.Now

ClockProviders.Local.Now用于应用程序范围内的一致性。

  

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

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

  

我该如何使用一个值而不是全部?

直接使用func1 <- function (x) { x + 1 } func2 <- function (x, plus = T) { if (plus == TRUE) { x + 2 } else { x - 5 } } func3 <- function (x) { x + 3 }