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메서드에 전달 될 수 있습니다 . 그리고 우리 DatedateToUse변수 의 속성을 사용하기 때문에 날짜를 얻고 시간 범위를 추가합니다.


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.