Как интерпретировать дату и время как местный часовой пояс пользователя в Acumatica - PullRequest
0 голосов
/ 06 февраля 2019

У нас есть кнопка «Пуск», которая заполняет поле dateStarted в DateTime.Now ..

При получении datetime оно всегда показывает дату / время сервера, а не версию локального часового пояса пользователя.Как мне заставить его работать как 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

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

После анализа того, как 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();
    }
0 голосов
/ 08 февраля 2019

Звучит так, как будто достаточно использовать PX.Common.PXTimeZoneInfo.Now, чтобы выполнить работу.

PX.Common.PXTimeZoneInfo также имеет UtcNow, UtcToday и Today при необходимости

0 голосов
/ 06 февраля 2019

Посмотрите код класса PXDBDateAndTime на Source Code экране SM204570.В целях отладки вы можете скопировать весь атрибут и переименовать его во что-то еще, например PXDBDateAndTimeDebug: enter image description here

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

При таком подходе вы можете отлаживать SetUseTimeZone и GetTimeZone методы.Используемый часовой пояс исходит из метода LocaleInfo.GetTimeZone, и вы также должны его отладить:

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

    return PXTimeZoneInfo.Invariant;
}

Проблема в том, что из вашего вопроса мы не можем сказать, есть ли проблема с обработкой часового пояса Acumaticaили если часовой пояс профиля пользователя правильно сконфигурирован в вашем экземпляре, или если ожидаемый результат на самом деле является действительным преобразованием ISO, как это сделано в среде DotNet.Отладка шаг за шагом должна показать, что происходит.

...