最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C#中處理時(shí)間戳和時(shí)區(qū)的解決方法

 更新時(shí)間:2024年06月13日 11:52:07   作者:一只拉古  
處理時(shí)間戳和不同的時(shí)區(qū)可能是軟件開(kāi)發(fā)中的一個(gè)棘手問(wèn)題,尤其是當(dāng)系統(tǒng)不確定給定的日期時(shí)間是UTC還是本地時(shí)間時(shí),通常會(huì)遇到與時(shí)間轉(zhuǎn)換相關(guān)的問(wèn)題,在這篇文章中,我將分享我們?nèi)绾卧贑#中處理時(shí)間戳和時(shí)區(qū),需要的朋友可以參考下

介紹

處理時(shí)間戳和不同的時(shí)區(qū)可能是軟件開(kāi)發(fā)中的一個(gè)棘手問(wèn)題。尤其是當(dāng)系統(tǒng)不確定給定的日期時(shí)間是UTC還是本地時(shí)間時(shí),通常會(huì)遇到與時(shí)間轉(zhuǎn)換相關(guān)的問(wèn)題。在這篇文章中,我將分享我們?nèi)绾卧贑#應(yīng)用程序中使用Unix時(shí)間來(lái)簡(jiǎn)化時(shí)間管理的經(jīng)驗(yàn)。

問(wèn)題

在我們的工作中,經(jīng)常遇到系統(tǒng)對(duì)給定的日期時(shí)間是UTC還是本地時(shí)間感到困惑,從而導(dǎo)致幾個(gè)小時(shí)的時(shí)間差異。這在不同時(shí)間格式和時(shí)區(qū)之間進(jìn)行轉(zhuǎn)換時(shí)尤其問(wèn)題嚴(yán)重。

我們的解決方案

為了解決這些問(wèn)題,我們決定使用Unix時(shí)間(以秒或毫秒為單位)來(lái)替換數(shù)據(jù)庫(kù)中的日期時(shí)間或字符串表示。Unix時(shí)間是一種定義明確的、與時(shí)區(qū)無(wú)關(guān)的時(shí)間表示方法,這使得時(shí)間處理和轉(zhuǎn)換變得更容易。

實(shí)現(xiàn)Timestamp類(lèi)

在我們的C#代碼中,我們創(chuàng)建了一個(gè)封裝Unix時(shí)間(以毫秒為單位)的Timestamp類(lèi)。這個(gè)類(lèi)提供了各種方法來(lái)轉(zhuǎn)換為其他時(shí)間格式或從其他時(shí)間格式轉(zhuǎn)換,確保所有時(shí)間操作的一致性和正確性。

Timestamp類(lèi)定義

以下是我們定義的Timestamp類(lèi):

public class Timestamp
{
    public double UnixTime_ms { get; set; } = 0.0;
    
    public static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public static Timestamp CurrentTimestamp()
    {
        return FromDateTimeUTC(DateTime.UtcNow);
    }

    public static Timestamp FromUnixTimeSec(double unix_s)
    {
        return new Timestamp()
        {
            UnixTime_ms = unix_s * 1000.0,
        };
    }

    public static Timestamp FromUnixTimeMilliSec(double unix_ms)
    {
        return new Timestamp()
        {
            UnixTime_ms = unix_ms,
        };
    }

    public static Timestamp FromDateTimeUTC(DateTime dateTime)
    {
        if (dateTime.Kind == DateTimeKind.Unspecified)
        {
            dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
        }

        return new Timestamp()
        {
            UnixTime_ms = (dateTime - UnixEpoch).TotalMilliseconds
        };
    }

    public static Timestamp FromTimestampUTC(string timestampUTC)
    {
        bool tryDateTime = DateTime.TryParse(timestampUTC, out DateTime res);
        if (tryDateTime)
        {
            long unixMs = new DateTimeOffset(res.ToUniversalTime()).ToUnixTimeMilliseconds();
            return new Timestamp()
            {
                UnixTime_ms = unixMs,
            };
        }
        else
        {
            return new Timestamp();
        }
    }

    public override bool Equals(object obj)
    {
        return obj is Timestamp timestamp &&
               UnixTime_ms == timestamp.UnixTime_ms;
    }

    public override int GetHashCode()
    {
        return -262018729 + UnixTime_ms.GetHashCode();
    }

    public static bool operator ==(Timestamp left, Timestamp right)
    {
        return EqualityComparer<Timestamp>.Default.Equals(left, right);
    }

    public static bool operator !=(Timestamp left, Timestamp right)
    {
        return !(left == right);
    }

    public static bool operator >(Timestamp left, Timestamp right)
    {
        return left.UnixTime_ms > right.UnixTime_ms;
    }

    public static bool operator <(Timestamp left, Timestamp right)
    {
        return left.UnixTime_ms < right.UnixTime_ms;
    }

    public static bool operator >=(Timestamp left, Timestamp right)
    {
        return left.UnixTime_ms >= right.UnixTime_ms;
    }

    public static bool operator <=(Timestamp left, Timestamp right)
    {
        return left.UnixTime_ms <= right.UnixTime_ms;
    }
}

轉(zhuǎn)換的擴(kuò)展方法

我們還創(chuàng)建了擴(kuò)展方法,用于在不同時(shí)間格式之間進(jìn)行轉(zhuǎn)換:

public static class TimestampExtensions
{
    private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    public static double ToUnixS(this Timestamp timestamp) => timestamp.UnixTime_ms / 1000.0;

    public static double ToUnixMins(this Timestamp timestamp) => timestamp.UnixTime_ms / 60000.0;

    public static DateTime ToDateTimeUTC(this Timestamp timestamp) => UnixEpoch.AddMilliseconds(timestamp.UnixTime_ms).ToUniversalTime();

    public static string ToLabel(this Timestamp timestamp) => timestamp.ToDateTimeUTC().ToString("yyyy/MM/dd h:mm:ss tt");

    public static bool IsWithinRange(this Timestamp timestamp, Timestamp startTime, Timestamp endTime)
    {
        if (timestamp == null || startTime == null || endTime == null)
        {
            return false;
        }

        return timestamp.UnixTime_ms >= startTime.UnixTime_ms
            && timestamp.UnixTime_ms <= endTime.UnixTime_ms;   
    }

    // 其他擴(kuò)展方法...
}

在主邏輯中使用Timestamp類(lèi)

在我們的主應(yīng)用程序邏輯中,我們專(zhuān)門(mén)使用Timestamp類(lèi)來(lái)表示時(shí)間。這種方法幫助我們避免了與時(shí)間轉(zhuǎn)換相關(guān)的任何問(wèn)題,因?yàn)樗械臅r(shí)間相關(guān)數(shù)據(jù)都以一致的格式存儲(chǔ)和處理。

以下是我們?cè)诖a中使用Timestamp類(lèi)的示例:

public class ExampleService
{
    public void ProcessData()
    {
        // 獲取當(dāng)前時(shí)間作為T(mén)imestamp
        Timestamp currentTime = Timestamp.CurrentTimestamp();

        // 將Timestamp轉(zhuǎn)換為DateTime以便顯示
        DateTime displayTime = currentTime.ToDateTimeUTC();

        // 記錄當(dāng)前時(shí)間
        Console.WriteLine($"當(dāng)前時(shí)間: {currentTime.ToLabel()}");
    }
}

在數(shù)據(jù)庫(kù)視圖(View)中轉(zhuǎn)換Unix時(shí)間

為了方便讀懂?dāng)?shù)據(jù)庫(kù)中Unix時(shí)間,可以創(chuàng)建處理這些轉(zhuǎn)換的視圖(View)。以下是在SQL Server中的示例:

CREATE VIEW dbo.ExampleView AS
SELECT
    Id,
    Name,
    Description,
    DATEADD(MILLISECOND, UnixTime_ms, '1970-01-01 00:00:00') AS DateTimeValue
FROM
    dbo.ExampleTable;

在C#數(shù)據(jù)訪問(wèn)層(DAO)中映射轉(zhuǎn)換

在查詢(xún)數(shù)據(jù)并將其映射到對(duì)象時(shí),可以在數(shù)據(jù)訪問(wèn)層中處理這些轉(zhuǎn)換:

public class ExampleRepository
{
    private readonly string connectionString;

    public ExampleRepository(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public ExampleModel GetExampleById(int id)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            string query = "SELECT Id, Name, Description, UnixTime_ms FROM ExampleTable WHERE Id = @Id";
            var exampleData = connection.QuerySingleOrDefault(query, new { Id = id });

            if (exampleData != null)
            {
                return new ExampleModel
                {
                    Id = exampleData.Id,
                    Name = exampleData.Name,
                    Description = exampleData.Description,
                    Timestamp = Timestamp.FromUnixTimeMilliSec(exampleData.UnixTime_ms)
                };
            }

            return null;
        }
    }
}

這種方法的好處

通過(guò)使用Unix時(shí)間和專(zhuān)門(mén)的Timestamp類(lèi),我們實(shí)現(xiàn)了以下幾個(gè)好處:

  • 一致性:所有時(shí)間數(shù)據(jù)都以一致的、與時(shí)區(qū)無(wú)關(guān)的格式表示。
  • 簡(jiǎn)便性:封裝在Timestamp類(lèi)中的轉(zhuǎn)換方法簡(jiǎn)化了時(shí)間操作。
  • 清晰性:代碼中明確顯示所有時(shí)間數(shù)據(jù)都以統(tǒng)一的方式處理,從而減少了錯(cuò)誤的風(fēng)險(xiǎn)。

結(jié)論

處理時(shí)間戳和時(shí)區(qū)可能很復(fù)雜,但通過(guò)使用Unix時(shí)間并將其封裝在Timestamp類(lèi)中,我們簡(jiǎn)化了時(shí)間管理并避免了許多常見(jiàn)的陷阱。我希望這種方法也能幫助到你的項(xiàng)目。

以上就是在C#中處理時(shí)間戳和時(shí)區(qū)的解決方法的詳細(xì)內(nèi)容,更多關(guān)于C#處理時(shí)間戳和時(shí)區(qū)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#基礎(chǔ)學(xué)習(xí)之封裝

    c#基礎(chǔ)學(xué)習(xí)之封裝

    說(shuō)到封裝,其實(shí)是比較基礎(chǔ)類(lèi)的問(wèn)題,它為程序設(shè)計(jì)提供了系統(tǒng)與系統(tǒng),模塊與模塊,類(lèi)與類(lèi)之間交互的實(shí)現(xiàn)手段
    2013-09-09
  • c# 適配器模式

    c# 適配器模式

    適配器模式:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另一個(gè)接口,Adapter使原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作
    2012-10-10
  • Unity3D基于陀螺儀實(shí)現(xiàn)VR相機(jī)功能

    Unity3D基于陀螺儀實(shí)現(xiàn)VR相機(jī)功能

    這篇文章主要為大家詳細(xì)介紹了Unity3D基于陀螺儀實(shí)現(xiàn)VR相機(jī)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c# Struct的一些問(wèn)題分析

    c# Struct的一些問(wèn)題分析

    在 C# 中,結(jié)構(gòu)體是值類(lèi)型數(shù)據(jù)結(jié)構(gòu)。它使得一個(gè)單一變量可以存儲(chǔ)各種數(shù)據(jù)類(lèi)型的相關(guān)數(shù)據(jù)。struct 關(guān)鍵字用于創(chuàng)建結(jié)構(gòu)體。結(jié)構(gòu)體是用來(lái)代表一個(gè)記錄。
    2021-06-06
  • C# 中使用 Exceptionless的方法

    C# 中使用 Exceptionless的方法

    這篇文章主要介紹了C# 中使用 Exceptionless的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語(yǔ)句(案例詳解)

    C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語(yǔ)句(案例詳解)

    這篇文章主要介紹了C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語(yǔ)句,主要包括hisql查詢(xún)樣例、group by查詢(xún)、鏈?zhǔn)讲樵?xún)及hisql語(yǔ)句和鏈?zhǔn)讲樵?xún)混用的sql語(yǔ)句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#基于SQLiteHelper類(lèi)似SqlHelper類(lèi)實(shí)現(xiàn)存取Sqlite數(shù)據(jù)庫(kù)的方法

    C#基于SQLiteHelper類(lèi)似SqlHelper類(lèi)實(shí)現(xiàn)存取Sqlite數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了C#基于SQLiteHelper類(lèi)似SqlHelper類(lèi)實(shí)現(xiàn)存取Sqlite數(shù)據(jù)庫(kù)的方法,涉及C#操作SQLite數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼

    Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼

    這篇文章主要介紹了Winform圓形環(huán)繞的Loading動(dòng)畫(huà)實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2014-01-01
  • WinForm子窗體訪問(wèn)父窗體控件的實(shí)現(xiàn)方法

    WinForm子窗體訪問(wèn)父窗體控件的實(shí)現(xiàn)方法

    WinForm子窗體訪問(wèn)父窗體控件的實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-03-03
  • C#按路徑流式遍歷XML節(jié)點(diǎn)的實(shí)用方法

    C#按路徑流式遍歷XML節(jié)點(diǎn)的實(shí)用方法

    在處理大型 XML 文檔時(shí),傳統(tǒng)的 XDocument.Load 會(huì)一次性將整個(gè)文檔加載到內(nèi)存中,對(duì)于大文件非常消耗資源,本文將分享一個(gè)按路徑流式遍歷 XML 節(jié)點(diǎn)的實(shí)用方法,支持深層嵌套路徑,并保持流式解析,需要的朋友可以參考下
    2025-10-10

最新評(píng)論

东辽县| 江门市| 徐州市| 巴塘县| 泰和县| 安阳县| 宁津县| 四会市| 安图县| 吉水县| 商都县| 修文县| 南雄市| 高台县| 什邡市| 磐安县| 伊吾县| 上栗县| 正安县| 大同市| 古田县| 阿拉尔市| 砀山县| 北海市| 兴化市| 永州市| 石泉县| 绥芬河市| 湘潭县| 井研县| 吴旗县| 思南县| 云林县| 镶黄旗| 屏东县| 阿荣旗| 定兴县| 成安县| 宜兰市| 康保县| 康马县|