ReportsDateTimeDisplayHelper.cs 2.87 KB
using System.Globalization;

namespace FoodLabeling.Application.Helpers;

/// <summary>
/// Reports Print Log 日期时间展示:统一为年月日顺序 <c>yyyy-MM-dd HH:mm</c>(精确到分钟)。
/// </summary>
public static class ReportsDateTimeDisplayHelper
{
    public const string DisplayFormat = "yyyy-MM-dd HH:mm";

    private static readonly string[] ExpiryParseFormats =
    {
        DisplayFormat,
        "yyyy-MM-dd H:mm",
        "yyyy-MM-dd",
        "yyyy/MM/dd HH:mm",
        "yyyy/MM/dd",
        "MM/dd/yyyy hh:mm tt",
        "MM/dd/yyyy h:mm tt",
        "MM/dd/yyyy HH:mm",
        "MM/dd/yyyy",
        "M/d/yyyy hh:mm tt",
        "M/d/yyyy h:mm tt",
        "M/d/yyyy",
        "dd/MM/yyyy HH:mm",
        "dd/MM/yyyy",
        "d/M/yyyy HH:mm",
        "d/M/yyyy",
    };

    /// <summary>打印时间展示(Printed at 列)</summary>
    public static string FormatPrintedAt(DateTime printedAt)
    {
        if (printedAt == DateTime.MinValue)
        {
            return "无";
        }

        return printedAt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
    }

    /// <summary>保质期展示(Expiration 列):解析后统一为 <see cref="DisplayFormat"/>。</summary>
    public static string FormatExpiryDisplay(string? raw)
    {
        if (string.IsNullOrWhiteSpace(raw) || string.Equals(raw.Trim(), "无", StringComparison.Ordinal))
        {
            return "无";
        }

        var s = raw.Trim();
        if (TryParseToDateTime(s, out var dt))
        {
            return dt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
        }

        return s;
    }

    private static bool TryParseToDateTime(string s, out DateTime dt)
    {
        if (DateTime.TryParse(
                s,
                CultureInfo.InvariantCulture,
                DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
                out dt))
        {
            return true;
        }

        if (DateTime.TryParse(
                s,
                CultureInfo.GetCultureInfo("en-US"),
                DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
                out dt))
        {
            return true;
        }

        foreach (var fmt in ExpiryParseFormats)
        {
            if (DateTime.TryParseExact(
                    s,
                    fmt,
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
                    out dt))
            {
                return true;
            }

            if (DateTime.TryParseExact(
                    s,
                    fmt,
                    CultureInfo.GetCultureInfo("en-US"),
                    DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
                    out dt))
            {
                return true;
            }
        }

        return false;
    }
}