2023. 12. 19. 14:19
Unity/C#
현재시간
long second= System.DateTime.Now.Ticks / 10000000 % 60;
long minute= System.DateTime.Now.Ticks / 10000000/60 % 60;
long hour= System.DateTime.Now.Ticks / 10000000/60/60 % 24;
System.DateTime.NowGetHour(System.DateTime.Now) //24시는 0으로 표기되고 23시는 23시로 나온다
DateTime Date = DateTime.UtcNow.AddYears(-10) //10년전
System.DateTime.Now
//결과:2021-06-08 PM 6:00:44
//Unix시간, 유닉스 타임 스탬프 (UnixTimeStamp)
//DateTime버전 길지만 변환이 쉬움
DateTime date=DateTime.Now;
(Int32)(date.Subtract(new DateTime(1970, 1, 1))).TotalSeconds
//결과: 2021-1-16 (6:12:31 GMT) => 1610788351
//역변환
DateTime date= new DateTime(1970, 1, 1).AddSeconds(unixTime);
//결과: 2021-1-16 (6:12:31 GMT) => 1610788351
//DateTimeOffset버전 짧지만 변환이 어려움
DateTimeOffset.Now.ToUnixTimeSeconds();
var time = System.DateTime.Now;
Debug.Log($"<b>[{time.Hour.ToString("D2")}:{time.Minute.ToString("D2")}:{time.Second.ToString("D2")}.{time.Millisecond.ToString("D3")}]</b>");
//굵은 글씨로 현재시간 시분초(소숫점 포함) 표기
//결과 : [18:17:30.428]
ticks를 datetime으로
long ticks = System.DateTime.UtcNow.Ticks;
System.DateTime dateTime = new System.DateTime(ticks);
Debug.Log(dateTime);
dateTime to int
기준일로부터 68년간 유효하다 (최대 69년)
//68년간 유효
long offsetYears = System.DateTime.MinValue.AddYears(1953).Ticks;
Debug.Log($"offsetYears: {offsetYears}");
long ticks = System.DateTime.Now.Ticks;
Debug.Log($"ticks: {ticks}");
int ticksInt = (int)((ticks- offsetYears)/ 10000000);
Debug.Log($"ticksInt: {ticksInt}");
long intToTicks = (long)ticksInt * 10000000+ offsetYears;
Debug.Log($"intToTicks: {intToTicks}");
System.DateTime dateTime = new System.DateTime(intToTicks);
Debug.Log($"dateTime: {dateTime}");
datetime 문자열 변환
var dateTimeString = dateTime.ToString();
dateTime= System.DateTime.Parse(dateTimeString);
DateTime To TimeSpan
원문 : https://stackoverflow.com/questions/17959440/convert-datetime-to-timespan
var timeSpan = System.TimeSpan.FromTicks(dateTime.Ticks);
DateTime To TotalDays
var timeSpan = System.TimeSpan.FromTicks(dateTime.Ticks);
var totalDays = timeSpan.TotalDays;
DateTime 덧셈
dateTime = dateTime.AddTicks(dateTime2.Ticks);
DateTime을 0~1 float로 변환
//오래될수록 1에 가까워짐
//샘플코드는 최대 한달
//7일전 = 0.2258064
//15일전 = 0.483871
//31일전 = 1
var lastUtcTime = System.DateTime.UtcNow.AddDays(-7); //7일전 접속
long min = System.DateTime.MinValue.Ticks;
long max = System.DateTime.MinValue.AddMonths(1).Ticks; //최대 1달
long normalizeTime = System.Math.Max((System.DateTime.UtcNow - lastUtcTime).Ticks, min);
normalizeTime = System.Math.Min(normalizeTime, max);
Debug.Log("마지막 접속으로부터 {(float)(((double)normalizeTime) / max)}개월 지남");
한달중 얼마나 지나갔는지 0~1float로 변환
단 day 기준임
v1
더보기
float CalculateDayRatioOfMonth(System.DateTime datetime)
{
var datetimeAddMonths1 = datetime.AddMonths(1);
var dayMax = datetimeAddMonths1.AddDays(-datetimeAddMonths1.Day).Day;
return datetime.Day / dayMax;
}
v2
float GetDayRatioOfMonth(System.DateTime datetime)
{
return datetime.Day / (float)System.DateTime.DaysInMonth(datetime.Year, datetime.Month);
}
날짜부분만 추출
v1
var date=System.DateTime.Parse(krTime.ToShortDateString());
v2
var date = krTime.Date;
DateTime의 Lerp
ChatGPT가 짜줬다
System.DateTime LerpDateTime(System.DateTime start, System.DateTime end, float t)
{
var ticksStart = start.Ticks;
var ticksEnd = end.Ticks;
var ticksLerp = (long)(ticksStart + (ticksEnd - ticksStart) * (double)t);
return new System.DateTime(ticksLerp);
}
한국시간 반환
var krTime = System.DateTime.UtcNow.AddHours(9);
일몰일출시간 반환
한국기준이고 2022년 기준으로 만들었다
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UdonSharp; | |
using UnityEngine; | |
using UnityEngine.UI; | |
using VRC.SDKBase; | |
using VRC.Udon; | |
public class RealTimeLightControllerUS : UdonSharpBehaviour | |
{ | |
void Update() | |
{ | |
SetTimeSpeed(); | |
var krTime = System.DateTime.UtcNow.AddHours(9); | |
var sunriseTime = GetSunriseTime(krTime); | |
var sunsetTime = GetSunsetTime(krTime); | |
{ | |
var acceleratedTime = new System.DateTime(new System.DateTime(krTime.TimeOfDay.Ticks * (long)timeSpeed).TimeOfDay.Ticks).AddTicks(krTime.Date.Ticks); | |
krTime = acceleratedTime; | |
} | |
{ | |
sunriseTime = sunriseTime.AddTicks(krTime.Date.Ticks); | |
sunsetTime = sunsetTime.AddTicks(krTime.Date.Ticks); | |
} | |
krTimeText.text = krTime.ToString()+$"(x{timeSpeed})"; | |
sunriseTimeText.text = sunriseTime.ToString(); | |
sunsetTimeText.text = sunsetTime.ToString(); | |
var nowTime = Time.time; | |
var delay = 0.5f; | |
if (nowTime > lastUpdateTime + delay) | |
{ | |
if (krTime < sunriseTime) | |
{ | |
timeSlider.value = 1; | |
} | |
else if (krTime < sunriseTime.AddMinutes(30)) | |
{ | |
var totalSeconds = (sunriseTime.AddMinutes(30) - krTime).TotalSeconds; | |
timeSlider.value = (float)totalSeconds / (60 * 30); | |
} | |
else if (krTime < sunsetTime.AddMinutes(-30)) | |
{ | |
timeSlider.value = 0; | |
} | |
else if (krTime < sunsetTime) | |
{ | |
var totalSeconds = (sunsetTime - krTime).TotalSeconds; | |
timeSlider.value = 1f - (float)totalSeconds / (60 * 30); | |
} | |
else | |
{ | |
timeSlider.value = 1f; | |
} | |
lastUpdateTime=nowTime; | |
} | |
} | |
float lastUpdateTime = 0; | |
System.DateTime preTime; | |
public Slider timeSlider; | |
public GameObject winterObject; | |
public Text krTimeText; | |
public Text sunriseTimeText; | |
public Text sunsetTimeText; | |
float timeSpeed=1; | |
void SetTimeSpeed() | |
{ | |
if (winterObject.activeInHierarchy) | |
{ | |
timeSpeed = 24; | |
} | |
else | |
{ | |
timeSpeed = 1; | |
} | |
} | |
System.DateTime GetSunsetTime(System.DateTime datetime) | |
{ | |
return LerpDateTime(GetSunsetTime(datetime.Month), GetSunsetTime(datetime.AddMonths(1).Month), GetDayRatioOfMonth(datetime)); | |
} | |
System.DateTime GetSunriseTime(System.DateTime datetime) | |
{ | |
return LerpDateTime(GetSunriseTime(datetime.Month), GetSunriseTime(datetime.AddMonths(1).Month), GetDayRatioOfMonth(datetime)); | |
} | |
System.DateTime LerpDateTime(System.DateTime start, System.DateTime end, float t) | |
{ | |
var ticksStart = start.Ticks; | |
var ticksEnd = end.Ticks; | |
var ticksLerp = (long)(ticksStart + (ticksEnd - ticksStart) * (double)t); | |
return new System.DateTime(ticksLerp); | |
} | |
float GetDayRatioOfMonth(System.DateTime datetime) | |
{ | |
return datetime.Day / (float)System.DateTime.DaysInMonth(datetime.Year, datetime.Month); | |
} | |
System.DateTime GetSunsetTime(int month) | |
{ | |
var time= System.DateTime.MinValue; | |
int h = 0; | |
int m = 0; | |
switch (month) | |
{ | |
case 1: | |
h = 17; | |
m = 38; | |
break; | |
case 2: | |
h = 18; | |
m = 10; | |
break; | |
case 3: | |
h = 18; | |
m = 39; | |
break; | |
case 4: | |
h = 19; | |
m = 7; | |
break; | |
case 5: | |
h = 19; | |
m = 51; | |
break; | |
case 6: | |
h = 19; | |
m = 54; | |
break; | |
case 7: | |
h = 19; | |
m = 51; | |
break; | |
case 8: | |
h = 19; | |
m = 23; | |
break; | |
case 9: | |
h = 18; | |
m = 39; | |
break; | |
case 10: | |
h = 17; | |
m = 54; | |
break; | |
case 11: | |
h = 17; | |
m = 22; | |
break; | |
case 12: | |
h = 17; | |
m = 16; | |
break; | |
} | |
time=time.AddHours(h); | |
time = time.AddMinutes(m); | |
return time; | |
} | |
System.DateTime GetSunriseTime(int month) | |
{ | |
var time = System.DateTime.MinValue; | |
int h = 0; | |
int m = 0; | |
switch (month) | |
{ | |
case 1: | |
h = 7; | |
m = 44; | |
break; | |
case 2: | |
h = 7; | |
m = 21; | |
break; | |
case 3: | |
h = 6; | |
m = 42; | |
break; | |
case 4: | |
h = 5; | |
m = 57; | |
break; | |
case 5: | |
h = 5; | |
m = 23; | |
break; | |
case 6: | |
h = 5; | |
m = 11; | |
break; | |
case 7: | |
h = 5; | |
m = 23; | |
break; | |
case 8: | |
h = 5; | |
m = 48; | |
break; | |
case 9: | |
h = 6; | |
m = 14; | |
break; | |
case 10: | |
h = 6; | |
m = 40; | |
break; | |
case 11: | |
h = 7; | |
m = 11; | |
break; | |
case 12: | |
h = 7; | |
m = 38; | |
break; | |
} | |
time = time.AddHours(h); | |
time = time.AddMinutes(m); | |
return time; | |
} | |
} |
'Unity > C#' 카테고리의 다른 글
c# Dictionary(딕셔너리) 관련 (0) | 2024.03.19 |
---|---|
Path 연산 (0) | 2023.09.09 |
csv 사용법 (0) | 2022.03.06 |