【问题标题】:How to interpret datetime as User's local timezone in Acumatica如何在 Acumatica 中将日期时间解释为用户的本地时区
【发布时间】:2019-02-06 05:37:19
【问题描述】:

我们有一个“开始”按钮,它将 dateStarted 字段填充到 DateTime.Now..

检索日期时间时,它始终显示服务器的日期/时间,而不是用户的本地时区版本。我如何让它像 lastModifiedDateTime/CreatedDateTime 一样工作,每当我们查看它时,它都会被格式化为用户的本地时区。我试过 UseTimeZone = true/false 但没有任何效果

这是我的代码不起作用

#region DateStarted
    public abstract class dateStarted : PX.Data.IBqlField
    {
    }
    protected DateTime? _DateStarted;
    [PXDBDateAndTime(DisplayNameDate = "Date Started", DisplayNameTime = "Time", UseTimeZone = true)]

    public virtual DateTime? DateStarted
    {
        get
        {
            return this._DateStarted;
        }
        set
        {
            this._DateStarted = value;
        }
    }
    #endregion

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    听起来只需使用PX.Common.PXTimeZoneInfo.Now 就足以完成这项工作。

    PX.Common.PXTimeZoneInfo 也有 UtcNowUtcTodayToday(如果需要)

    【讨论】:

      【解决方案2】:

      Source Code 屏幕SM204570 中查找类PXDBDateAndTime 的代码。出于调试目的,您可以复制整个属性并将其重命名为 PXDBDateAndTimeDebug 之类的其他名称:

      [PXDBDateAndTimeDebug(DisplayNameDate = "Date Started", DisplayNameTime = "Time", UseTimeZone = true)]
      

      使用这种方法,您可以调试 SetUseTimeZoneGetTimeZone 方法。使用的时区来自LocaleInfo.GetTimeZone 方法,你也应该调试它:

      public static PXTimeZoneInfo GetTimeZone()
      {
          if (!PXContext.PXIdentity.IsAnonymous() && PXContext.PXIdentity.TimeZone != null)
          {
              return PXContext.PXIdentity.TimeZone;
          }
      
          return PXTimeZoneInfo.Invariant;
      }
      

      这里的问题是,根据您的问题,我们无法判断 Acumatica 时区处理是否确实存在问题,或者您的实例中是否正确配置了用户配置文件时区,或者您期望的结果是否实际上是由 DotNet 框架完成的有效 ISO 转换。一步一步调试应该会揭示发生了什么。

      【讨论】:

      • 我注意到在某些配置中显示的值是本地时间,但作为 UTC 时间存储在数据库中。此外,如果用户没有设置时区,我认为它将使用服务器时区。只是一些想法。
      • 也可以尝试使用 PX.Common.PXTimeZoneInfo.Now vs DateTime.Now 来查看是否在用户时区。可能开始的字段集不正确?我之前遇到过类似的问题 - 我必须找到我使用的配置,但为了获得现在时间,我总是使用 PX.Common.PXTimeZoneInfo.Now
      • 我还认为用户时区配置与预期的语言环境不匹配。如果没有时区配置,它应该默认为 PXTimeZoneInfo.Invariant GMT 0000(根据源代码)。
      【解决方案3】:

      分析 CreatedDateTime 和 LastModifiedDatetime 以及其他日期的行为如何相同后,问题出在输入中。所以我创建了以下代码来保存关于当前用户时区的正确日期时间。

       public static class DateTimeHelper
      {
          public static DateTime? Now()
          {
              var test = LocaleInfo.GetTimeZone();
              PXTimeZoneInfo timezone = LocaleInfo.GetTimeZone();
              DateTime dt = DateTime.UtcNow;
              dt = PXTimeZoneInfo.ConvertTimeFromUtc(dt, timezone);
              return dt;
          }
      }
      

      和实施:

        public PXAction<CQLMChecklists> startButton;
          [PXUIField(DisplayName = "Start", Visible = true)]
          [PXButton()]
          public virtual void StartButton()
          {
              if (Document.Current != null)
              {
                  CQLMChecklists doc = Document.Current;
      
                  Actions.PressSave();
      
      
                  CommenceChecklist(DateTimeHelper.Now(), DateTimeHelper.Now().Value, ref doc);
                  Document.Update(doc);
              }
              Actions.PressSave();
          }
      

      【讨论】:

      • 您是否尝试过 PX.Common.PXTimeZoneInfo.Now,它看起来与您的 Now 方法类似?
      • 嗨,布伦丹,是的,没错。我会用那个。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2021-05-02
      • 2012-01-28
      • 2019-01-14
      • 2015-05-27
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多