在Unity中处理时间、时区和时间戳转换

1. System.DateTime 基础类

基本时间操作

// 获取当前时间
DateTime now = DateTime.Now; // 本地时间
DateTime utcNow = DateTime.UtcNow; // UTC时间

// 创建指定时间
DateTime date = new DateTime(2024, 1, 1, 10, 30, 0);

// 时间格式化
string formatted = now.ToString("yyyy-MM-dd HH:mm:ss");
string iso8601 = now.ToString("o"); // ISO 8601格式

2. 时间戳转换

Unix时间戳(秒)

using System;

public class TimestampConverter
{
    // DateTime转Unix时间戳(秒)
    public static long DateTimeToUnixTimestamp(DateTime dateTime)
    {
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        TimeSpan diff = dateTime.ToUniversalTime() - origin;
        return (long)Math.Floor(diff.TotalSeconds);
    }
    
    // Unix时间戳(秒)转DateTime
    public static DateTime UnixTimestampToDateTime(long unixTimestamp)
    {
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        return origin.AddSeconds(unixTimestamp).ToLocalTime();
    }
}

毫秒级时间戳

public class TimestampConverter
{
    // DateTime转毫秒时间戳
    public static long DateTimeToMillisecondsTimestamp(DateTime dateTime)
    {
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        TimeSpan diff = dateTime.ToUniversalTime() - origin;
        return (long)diff.TotalMilliseconds;
    }
    
    // 毫秒时间戳转DateTime
    public static DateTime MillisecondsTimestampToDateTime(long millisecondsTimestamp)
    {
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        return origin.AddMilliseconds(millisecondsTimestamp).ToLocalTime();
    }
}

3. 时区处理

使用 TimeZoneInfo

using System;

public class TimeZoneHelper
{
    // 获取所有可用时区
    public static void ListAllTimeZones()
    {
        ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones();
        foreach (TimeZoneInfo zone in zones)
        {
            Debug.Log($"ID: {zone.Id}, Display: {zone.DisplayName}");
        }
    }
    
    // 时区转换
    public static DateTime ConvertTimeZone(DateTime dateTime, 
                                          string sourceTimeZoneId, 
                                          string targetTimeZoneId)
    {
        TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(sourceTimeZoneId);
        TimeZoneInfo targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById(targetTimeZoneId);
        
        DateTime sourceDateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
        DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(sourceDateTime, sourceTimeZone);
        DateTime targetDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, targetTimeZone);
        
        return targetDateTime;
    }
    
    // 常用时区转换示例
    public static DateTime ConvertToUTC(DateTime localTime)
    {
        return TimeZoneInfo.ConvertTimeToUtc(localTime);
    }
    
    public static DateTime ConvertFromUTC(DateTime utcTime, string targetTimeZoneId = "China Standard Time")
    {
        return TimeZoneInfo.ConvertTimeFromUtc(utcTime, 
            TimeZoneInfo.FindSystemTimeZoneById(targetTimeZoneId));
    }
}

4. Unity特定的时间处理

Time 类(游戏时间)


public class GameTimeManager : MonoBehaviour
{
    void Update()
    {
        // 游戏时间(受Time.timeScale影响)
        float gameTime = Time.time;
        float deltaTime = Time.deltaTime;
        float fixedTime = Time.fixedTime;
        float fixedDeltaTime = Time.fixedDeltaTime;
        
        // 实时时间(不受Time.timeScale影响)
        float realTime = Time.realtimeSinceStartup;
        float unscaledDeltaTime = Time.unscaledDeltaTime;
    }
}

5. 实用工具类

using System;
using System.Collections.Generic;
using UnityEngine;

public static class TimeUtility
{
    // 常用时区ID
    public static class TimeZoneIds
    {
        public const string UTC = "UTC";
        public const string ChinaStandard = "China Standard Time"; // 中国标准时间
        public const string EasternStandard = "Eastern Standard Time"; // 美国东部
        public const string PacificStandard = "Pacific Standard Time"; // 美国太平洋
    }
    
    // 获取当前时间戳(秒)
    public static long CurrentUnixTimestamp
    {
        get
        {
            return DateTimeToUnixTimestamp(DateTime.UtcNow);
        }
    }
    
    // 获取当前时间戳(毫秒)
    public static long CurrentMillisecondsTimestamp
    {
        get
        {
            return DateTimeToMillisecondsTimestamp(DateTime.UtcNow);
        }
    }
    
    // 格式化时间显示
    public static string FormatTime(DateTime dateTime, string format = "yyyy-MM-dd HH:mm:ss")
    {
        return dateTime.ToString(format);
    }
    
    // 获取相对时间描述(如"刚刚"、"3分钟前"等)
    public static string GetRelativeTime(DateTime dateTime)
    {
        TimeSpan span = DateTime.Now - dateTime;
        
        if (span.TotalSeconds < 60)
            return "刚刚";
        if (span.TotalMinutes < 60)
            return $"{(int)span.TotalMinutes}分钟前";
        if (span.TotalHours < 24)
            return $"{(int)span.TotalHours}小时前";
        if (span.TotalDays < 30)
            return $"{(int)span.TotalDays}天前";
        if (span.TotalDays < 365)
            return $"{(int)(span.TotalDays / 30)}个月前";
        
        return $"{(int)(span.TotalDays / 365)}年前";
    }
    
    // 计算时间差
    public static TimeSpan GetTimeDifference(DateTime start, DateTime end)
    {
        return end - start;
    }
    
    // 检查是否为同一天
    public static bool IsSameDay(DateTime date1, DateTime date2)
    {
        return date1.Year == date2.Year && 
               date1.Month == date2.Month && 
               date1.Day == date2.Day;
    }
}

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇