Get it on Google Play Get it on Google Play Get it on Google Play


Wm뮤 :: 자주 쓰는 DateTime 코드 모음

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


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년 기준으로 만들었다

 

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
posted by 모카쨩

저사양 유저용 블로그 진입