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()
{
}
}