DateTime에서 시간을 변경하는 방법?


353

DateTime변수 "s" 의 시간 만 어떻게 변경할 수 있습니까?

DateTime s = some datetime;

답변:


598

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데이터베이스 항목 .


11
s.Date.Add (new TimeSpan (0, 0, 0))도 작동합니다. 며칠 사이에 검사 할 때 시간을 null로 사용합니다.
— Yogurt The Wise

8
@ user295734 : 왜 Add제로 타임스 팬 제공 을 요청 하시겠습니까? 당신의 표현은 s.Date, 그러나 더 오래갑니다 ...
— Jon Skeet

그것을 수정하는 것을 잊어 버렸습니다. 코드에 넣은 후에 0으로 설정하기 위해 깨달았습니다 (원래 검색했던 것). 하지만 0으로 설정하지 않으면 한 줄로 시간을 설정하는 방법을 보여 주려고했습니다.
— Yogurt The Wise

3
2 DateTime초 (날짜와 시간에 하나씩)가 있으면 다음과 같이 할 수 있습니다.var result = date.Date + time.TimeOfDay;
— Zachary Yates

2
@ZacharyYates : 예. 그 시점에서 모델이 처음부터 깨져서 time해서는 안된다고 주장합니다 DateTime. (물론 Noda Time을 사용 하겠지만 ...)
— Jon Skeet

100

좋아, 내 제안, 확장 방법으로 다이빙하고 있습니다.

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);

6
이것은 기본적으로와 동일합니다 Datetime.Today.Add(time.TimeOfDay). 내부적으로 생성자는 날짜 부분의 윤년을 고려하지 않고 달력 기반 수정을 수행하지 않기 때문입니다. 즉 DateTime, 파이썬 datetime모듈 측면에서 "순진한"구현입니다 .
— ivan_pozdeev

68
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

이러한 방식으로 원하는 시간에 새로운 시간, 분, 초를 삽입하면서 날짜를 보존 할 수 있습니다.


@Webleeuw 물론 , 추가 된 값에 따라 ArgumentOutOfRangeException 의 원격 가능성이 있습니다. 여기의 PEX의 이을 보여 퍼즐.
— lifebalance

사용 사례에 따라 .AddMilliseconds()필요한 경우 수행 할 수도 있습니다 .
— Broots Waymb

40

짧막 한 농담

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));

오늘 날짜를 4:30:00 시간으로 되돌리려면 DateTime을 바꾸십시오.


22

DateTime은 변경할 수없는 유형이므로 변경할 수 없습니다 .

그러나 이전 인스턴스를 기반으로 새 DateTime 인스턴스를 만들 수 있습니다. 귀하의 경우 Date 속성이 필요한 것처럼 들리며 시간을 나타내는 TimeSpan을 추가 할 수 있습니다.

이 같은:

var newDt = s.Date + TimeSpan.FromHours(2);

17

다른 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변수 의 속성을 사용하기 때문에 날짜를 얻고 시간 범위를 추가합니다.


16

가장 간단한 해결책 :

DateTime s = //some Datetime that you want to change time for 8:36:44 ;
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44);

그리고 특정 날짜 및 시간 형식이 필요한 경우 :

s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");

9
DateTime ts = DateTime.Now;
ts = new DateTime ( ts.Year, ts.Month, ts.Day, 0, 0, 0 ) ;
Console.WriteLine ( "Today = " + ts.ToString("M/dd/yy HH:mm:ss") ) ;

실행 : 오늘 = 9/04/15 00:00:00


8

내가 같은 기능을 찾고 있었을 때이 게시물을 통해이 사람이 원하는 것을 할 수있었습니다. 원래 날짜를 잡고 시간 부분을 교체하십시오.

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");

4

이후 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);

3

2014/02/05 18:19:51과 같은 DateTime이 있고 2014/02/05 만 원하는 경우 다음을 수행 할 수 있습니다.

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)

3

날짜에 .Date를 추가하면 자정 (00:00)으로 설정됩니다.

MyDate.Date

참고 동등한 SQL은CONVERT(DATETIME, CONVERT(DATE, @MyDate))

이 방법이 좋은 이유는 타이핑이 빠르고 읽기 쉽다는 것입니다. 보너스는 문자열에서 변환이 없다는 것입니다.

즉, 오늘 날짜를 23:30으로 설정하려면 다음을 사용하십시오.

DateTime.Now.Date.AddHours(23).AddMinutes(30)

물론 DateTime.Now 또는 MyDate를 원하는 날짜로 바꿀 수 있습니다.



2
int year = 2012;
int month = 12;
int day = 24;
int hour = 0;
int min = 0;
int second = 23;
DateTime dt = new DateTime(year, month, day, hour, min, second);

2

사용 Date.Add하고 추가 New TimeSpan추가 할 새 시간

DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))

1

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

추가하고 위해서, addXXX 방법을 사용하여 빼기
— 크리스 Richner을

1

다음과 같은 방법으로 사용할 수 있습니다.

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
        );
}

1

비슷한 문제가 있었기 때문에 MVC에서 Entity Framework 객체의 시간을 설정하여 날짜 (뷰 선택기)에서 날짜를 가져와 시간 구성 요소를 00:00:00으로 설정하려고했지만이 게시물을 보았습니다. 현재 시간이됩니다. 이 게시물의 답변을 바탕으로 나는 다음을 생각해 냈습니다.

myEntity.FromDate += DateTime.Now.TimeOfDay;

1
//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();

1

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);

0

초를 추가하거나 빼는 DateTime.AddSeconds 메서드의 문제점은 무엇입니까?


그뿐만 아니라 질문에 대답하는 것처럼 들리지 않습니다. OP가 같은 시간이지만 특정 시간의 DateTime을 원한다고 생각합니다 .AddSeconds를 사용하는 것은 상대적으로 어렵습니다.
— Jon Skeet

0
  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));

@ 존 : 나는 라인에 댓글을 달았습니다. 사용자는이 코드를 사용하기 전에 값을 할당해야합니다.
— Saar

@Saar : 더 중요한 것은 이제 할당을 s에 다시 추가했습니다 (s.Add (...) 호출 제외).
— Jon Skeet

@Jon : 수업을 배웠습니다. 당신의 친절과 시간에 감사드립니다. 진심이야.
— Saar

0

그래도 문제가 해결되지 않습니까?

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);

0

나는 이것을 선호한다 :

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);

0
 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


-1

가장 좋은 해결책은 다음과 같습니다.

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);

1
처음에는 이것이 잘못되었다고 생각했지만 결과를 DateTime 객체에 할당 하면 의미 가 있습니다. 그러나 최상의 솔루션은 아닙니다. 날짜의 날짜 부분을 가져와 추가하는 것이 가장 좋은 동안 올바른 계산을 수행하려면 현재 시간 부분을 알아야합니다.
— ThunderGr

1
확실히 "최고"가 아닙니다. 매직 넘버를 읽고 반복적으로 사용하는 것과는 거리가 멀다.
— BartoszKP

-1

이거 한번 해봐

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;

-5

여기 빈민가 방법이지만 작동합니다 :)

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)권장하지는 않습니다.
— mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.