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

public class Lesson12 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 目前学习的时间相关的类
        //目前我们只在Unity中学习过Time类
        //我们可以通过Time获取当前游戏相关的时间
        //如帧间隔时间、游戏运行的时间帧率等

        //但是我们没有学习过如何获取真实时间相关的类
        //比如如何知道当前时间的年月日时分秒
        //这节课我们要学习的就是真实时间相关的类
        #endregion

        #region 知识点二 时间类在游戏中的需求
        //在游戏开发中我们经常需要和时间打交道
        //比如每日签到活动、限时任务、倒计时等等功能的开发
        //如果要做这些功能,仅靠Unity提供的Time类是远远不够的
        //这时候我们需要学习专门的日期和时间相关的知识
        //在C#中
        //C#提供了对应的结构体让我们处理时间和日期逻辑
        //1.DateTime 日期结构体
        //2.TimeSpan 时间间隔结构体
        #endregion

        #region 知识点三 一些基础时间概念说明
        //1秒 = 1000毫秒(ms)
        //1毫秒(ms) = 1000微秒(μs)
        //1微秒(μs) = 1000纳秒(ns)

        //公元纪元:
        //公历纪元是一种纪年法
        //目前全世界普遍使用
        //比如2022年就是从公元元年开始计算的第二零二二年

        //格林尼治标准时间(GMT):
        //旧译"格林威治平时"
        //是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线
        //由于地球每天的自转有些不规则,而且正在缓慢减速
        //因此,格林尼治时间已经不再被作为标准时间使用
        //现在的标准时间·协调世界时(UTC)

        //协调世界时(UTC):
        //又称世界统一时间、世界标准时间、国际协调时间
        //UTC协调世界时是基于原子时钟的平太阳时,是指格林尼治所在地的标准时间,
        //也是表示地球自转速率的一种形式
        //UTC作为国际原子时间基准,通过不规则的加入闰秒来抵消地球自转变慢的影响,保证与天文时基本同步

        //时间戳
        //从1970年1月1日(UNIX时间的起始时间)到现在的总秒数
        //很多编程语言的时间计算都是基于1970年1月1日开始的
        //因为许多计算机系统起源于UNIX系统,而UNIX系统认为1970年1月1日0点是时间纪元
        //因此我们常说的UNIX时间戳就是以1970年1月1日0点为计时起点的
        //原因
        //早期计算机系统是32位的,而时间也是用32位表示
        //我们知道32位能表示的最大十进制数是2147483647
        //1年=365天,换算秒数是31536000
        //那么2147483647/31536000≈68.1年
        //也就是说用32位表示时间,最多只能表示68年
        //UNIX系统考虑到这个数值的实用性和应用的普及性
        //最终选取了1970年1月1日作为UNIX TIME的纪元时间(起始时间)
        #endregion

        #region 知识点四 DateTime
        //命名空间:System
        //DateTime 是 C# 提供给我们的处理日期和时间的结构体
        //DateTime 的默认最小值是0001年1月1日00:00:00(午夜)
        //         最大值是9999年12月31日23:59:59
        #region 初始化
        //主要参数:
        //年、月、日、时、分、秒、毫秒
        //ticks(以100纳秒为单位的时间间隔,从0001年1月1日00:00:00.000开始计算,是一个非常大的数字)
        //可选参数:
        //DateTimeKind(时间类型)
        //  Local(本地时间)
        //  Utc(UTC时间)
        //  Unspecified(未指定)
        //Calendar:日历
        //使用哪个国家的日历,一般在Unity开发中不使用
        DateTime dt = new DateTime(2022, 12, 1, 13, 30, 45, 500);
        //年、月、日、时、分、秒、毫秒
        print(dt.Year + "-" + dt.Month + "-" + dt.Day + "-" + dt.Hour + "-" + dt.Minute + "-" + dt.Second + "-" + dt.Millisecond);
        //以100纳秒为单位的时间间隔,从0001年1月1日00:00:00.000开始计算,是一个非常大的数字
        print(dt.Ticks);
        //一年中的第几天
        print(dt.DayOfYear);
        //星期几
        print(dt.DayOfWeek);
        #endregion

        #region 获取时间
        //当前日期和时间
        DateTime nowTime = DateTime.Now;
        print(nowTime.Minute);
        //返回当前日期
        DateTime nowTime2 = DateTime.Today;
        print(nowTime2.Year + "-" + nowTime2.Month + "-" + nowTime2.Day);
        //返回当前UTC日期和时间
        DateTime nowTimeUTC = DateTime.UtcNow;
        #endregion

        #region 时间计算
        //加减时间
        DateTime nowTime3 = nowTime.AddDays(-1);
        print(nowTime3.Day);
        #endregion

        #region 字符串转换
        print(nowTime.ToString());
        print(nowTime.ToShortTimeString());
        print(nowTime.ToShortDateString());
        print(nowTime.ToLongTimeString());
        print(nowTime.ToLongDateString());

        print(nowTime.ToString("D"));
        print(nowTime.ToString("yyyy-MM-dd-ddd/HH-mm-ss"));
        #endregion

        #region 字符串转DateTime
        //字符串要转DateTime成功的话 
        //那么该字符串的格式需要匹配 一般用toString转换出来的字符串都可以转回去
        //年/月/日 时:分:秒
        string str = nowTime.ToString();
        str = "1988/5/4 18:00:08";
        print(str);
        DateTime dt3;
        if(DateTime.TryParse(str, out dt3))
        {
            print(dt3);
        }
        else
        {
            print("转换失败");
        }
        #endregion

        #region 存储时间
        //存储时间 方式很多
        //1.直接存字符串
        //2.直接存Ticks
        //3.直接存时间戳信息

        //存储时间建议用Ticks 最节省
        #endregion

        #endregion

        #region 知识点五 TimeSpan
        //命名空间:System
        //TimeSpan 是 C# 提供给我们的时间间隔结构体
        //与DateTime配合使用 可以获取时间差
        TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1);
        print(ts.TotalMinutes);
        print(ts.TotalSeconds);
        print(ts.TotalDays);
        print(ts.TotalHours);
        print(ts.Ticks);

        print(ts.Days + "-" + ts.Hours + "-" + ts.Minutes + "-" + ts.Seconds + "-" + ts.Milliseconds);

        #region 初始化(创建时间间隔)
        TimeSpan ts2 = new TimeSpan(1,0,0,0);
        DateTime timeNow = DateTime.Now + ts2;
        #endregion

        #region 时间间隔运算
        TimeSpan ts3 = new TimeSpan(0, 1, 1, 1);
        TimeSpan ts4 = ts2 + ts3;
        print(ts4.Days + "-" + ts4.Hours);
        #endregion

        #region 通过总Ticks进行时间计算
        print(ts4.Ticks / TimeSpan.TicksPerSecond);
        #endregion

        #endregion
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

不会做游戏!