답변:
DateTime 값을 변경할 수 없습니다-변경할 수 없습니다. 그러나 새 값을 가지도록 변수를 변경할 수 있습니다. 시간 만 변경하는 가장 쉬운 방법은 관련 시간으로 TimeSpan을 만들고 DateTime.Date 속성을 사용하는 것입니다.
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
이제 같은 날짜이지만 오전 10시 30 분입니다.
DateTime
양방향으로 "순진한"Gregorian 시간을 나타내는 일광 절약 시간제 전환 을 무시합니다 ( DateTime
문서의 설명 섹션 참조 ). 유일한 예외는 .Now
및 .Today
:이 이벤트가 발생할 때이를 반영하는 현재 시스템 시간을 검색합니다.
이것은 현재 생산 준비가 된 Noda Time 프로젝트 를 시작하도록 동기를 부여한 것입니다 . 그 ZonedDateTime
유형은 "인식"한다 에 연결하여 tz
데이터베이스 항목 .
Add
제로 타임스 팬 제공 을 요청 하시겠습니까? 당신의 표현은 s.Date
, 그러나 더 오래갑니다 ...
DateTime
초 (날짜와 시간에 하나씩)가 있으면 다음과 같이 할 수 있습니다.var result = date.Date + time.TimeOfDay;
time
해서는 안된다고 주장합니다 DateTime
. (물론 Noda Time을 사용 하겠지만 ...)
좋아, 내 제안, 확장 방법으로 다이빙하고 있습니다.
public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds)
{
return new DateTime(
dateTime.Year,
dateTime.Month,
dateTime.Day,
hours,
minutes,
seconds,
milliseconds,
dateTime.Kind);
}
그런 다음 전화 :
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
이 확장 프로그램은 새로운 날짜 개체를 반환하므로이 작업을 수행 할 수 없습니다.
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
그러나 당신은 이것을 할 수 있습니다 :
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. 내부적으로 생성자는 날짜 부분의 윤년을 고려하지 않고 달력 기반 수정을 수행하지 않기 때문입니다. 즉 DateTime
, 파이썬 datetime
모듈 측면에서 "순진한"구현입니다 .
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
이러한 방식으로 원하는 시간에 새로운 시간, 분, 초를 삽입하면서 날짜를 보존 할 수 있습니다.
.AddMilliseconds()
필요한 경우 수행 할 수도 있습니다 .
다른 DateTime
객체 에 이미 시간이 저장되어 있으면이 Add
방법을 사용할 수 있습니다 .
DateTime dateToUse = DateTime.Now();
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM
DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay);
이 TimeOfDay
속성은 TimeSpan
객체이며 Add
메서드에 전달 될 수 있습니다 . 그리고 우리 Date
는 dateToUse
변수 의 속성을 사용하기 때문에 날짜를 얻고 시간 범위를 추가합니다.
이후 DateTime
불변 새로운 인스턴스는 날짜 컴포넌트 요구 사항이 변경 될 때 생성되어야한다. 불행히도, 개별 구성 요소를 설정하는 기본 제공 기능은 없습니다DateTime
인스턴스의 .
다음 확장 방법 사용
public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second)
{
return new DateTime(
year ?? dateTime.Year,
month ?? dateTime.Month,
day ?? dateTime.Day,
hour ?? dateTime.Hour,
minute ?? dateTime.Minute,
second ?? dateTime.Second
);
}
public static DateTime SetYear(this DateTime dateTime, int year)
{
return dateTime.SetPart(year, null, null, null, null, null);
}
public static DateTime SetMonth(this DateTime dateTime, int month)
{
return dateTime.SetPart(null, month, null, null, null, null);
}
public static DateTime SetDay(this DateTime dateTime, int day)
{
return dateTime.SetPart(null, null, day, null, null, null);
}
public static DateTime SetHour(this DateTime dateTime, int hour)
{
return dateTime.SetPart(null, null, null, hour, null, null);
}
public static DateTime SetMinute(this DateTime dateTime, int minute)
{
return dateTime.SetPart(null, null, null, null, minute, null);
}
public static DateTime SetSecond(this DateTime dateTime, int second)
{
return dateTime.SetPart(null, null, null, null, null, second);
}
당신은 DateTime
같은 개별 구성 요소 를 설정할 수 있습니다
var now = DateTime.Now;
now.SetSecond(0);
2014/02/05 18:19:51과 같은 DateTime이 있고 2014/02/05 만 원하는 경우 다음을 수행 할 수 있습니다.
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
날짜에 .Date를 추가하면 자정 (00:00)으로 설정됩니다.
MyDate.Date
참고 동등한 SQL은CONVERT(DATETIME, CONVERT(DATE, @MyDate))
이 방법이 좋은 이유는 타이핑이 빠르고 읽기 쉽다는 것입니다. 보너스는 문자열에서 변환이 없다는 것입니다.
즉, 오늘 날짜를 23:30으로 설정하려면 다음을 사용하십시오.
DateTime.Now.Date.AddHours(23).AddMinutes(30)
물론 DateTime.Now 또는 MyDate를 원하는 날짜로 바꿀 수 있습니다.
실제로 시간을 만든 후에는 변경할 수 없습니다. 그러나 많은 생성자로 쉽게 만들 수 있습니다 : https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
예를 들어 초를 변경하는 DateTime을 만들려면 다음과 같이하십시오.
DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
DateTime
객체 를 생성 할 때 시간을 지정할 수있는 생성자를 사용하십시오.
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
이미 DateTime
개체가 있고 시간을 변경하려면 DateTime
간단한 방법을 사용하여 분, 시간 또는 초를 추가 할 수 있습니다 .
var myDateTime = new DateTime(2000, 01, 01); // 2000-01-01 00:00:00
myDateTime = myDateTime.AddHours(13); // 2000-01-01 13:00:00
myDateTime = myDateTime.AddMinutes(37); // 2000-01-01 13:37:00
myDateTime = myDateTime.AddSecounds(42); // 2000-01-01 13:37:42
각 메소드 호출의 결과를 myDateTime
변수 에 "저장"하는 방법에 주목 하십시오. 이는 DateTime
변경할 수 없기 때문에 메소드는 단순히 추가 시간 / 분 / 초를 추가하여 새 인스턴스를 작성합니다.
시간과 분 (및 / 또는 초)과 같은 시간을 모두 추가해야하는 경우 대신 TimeSpan
원본에 a 를 추가하여 코드를 단순화 할 수 있습니다 DateTime
.
var myDateTime = new DateTime(2000, 01, 01); // 2000-01-01 00:00:00
myDateTime += new TimeSpan(13, 37, 42); // 2000-01-01 13:37:42
기존 값에 추가하지 않고 절대 시간 / 분 / 초를 설정하려는 경우 위에서 언급 한 DateTime
생성자를 사용하여 이전의 년 / 월 / 일 값을 재사용 할 수 있습니다 .
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
다음과 같은 방법으로 사용할 수 있습니다.
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
방법은 다음과 같습니다. 아마 더 좋은 방법이 있지만 방금 채찍질했습니다.
public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds };
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue)
{
return new DateTime(
part == DateTimePart.Years ? newValue : dt.Year,
part == DateTimePart.Months ? newValue : dt.Month,
part == DateTimePart.Days ? newValue : dt.Day,
part == DateTimePart.Hours ? newValue : dt.Hour,
part == DateTimePart.Minutes ? newValue : dt.Minute,
part == DateTimePart.Seconds ? newValue : dt.Second
);
}
//The fastest way to copy time
DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x
justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks);
Console.WriteLine(justDate); // 1/1/2011 10:15:30AM
Console.Read();
DateTime
여러 가지 방법으로 초기 값을 새 값에 지정할 수 있습니다 .
확장 방법 DateTime
public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds = default, int milliseconds = default)
{
return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, hours, minutes, seconds, milliseconds, dateTime.Kind);
}
다음을 사용하여 ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
Add 메소드 사용
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
타임스 팬 사용
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
초기 값 사용
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
매개 변수에 + ve / -ve 값을 추가 할 수 있습니다.
s.Add(new TimeSpan(1, 1, 1));
Using an extencion to DateTime:
public enum eTimeFragment
{
hours,
minutes,
seconds,
milliseconds
}
public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf)
{
DateTime dtRet = dateToClear;
switch (etf)
{
case eTimeFragment.hours:
dtRet = dateToClear.Date;
break;
case eTimeFragment.minutes:
dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1);
dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds);
break;
case eTimeFragment.seconds:
dtRet = dateToClear.AddSeconds(dateToClear.Second * -1);
dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds);
break;
case eTimeFragment.milliseconds:
dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1);
break;
}
return dtRet;
}
다음과 같이 사용하십시오.
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
이 반환해야합니다 : 2016-06-06 00 : 00 : 00.000
가장 좋은 해결책은 다음과 같습니다.
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
여기 빈민가 방법이지만 작동합니다 :)
DateTime dt = DateTime.Now; //get a DateTime variable for the example
string newSecondsValue = "00";
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue));
dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)
권장하지는 않습니다.