DateTime में समय कैसे बदलें?


353

मैं अपने DateTimeचर "s" में केवल समय कैसे बदल सकता हूं ?

DateTime s = some datetime;

जवाबों:


598

आप दिनांक समय मान नहीं बदल सकते - यह अपरिवर्तनीय है। हालाँकि, आप नया मान रखने के लिए चर को बदल सकते हैं। ऐसा करने का सबसे आसान तरीका है कि बस समय बदलने के लिए संबंधित समय के साथ एक TimeSpan बनाना है, और DateTime.Date संपत्ति का उपयोग करें:

DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;

s अब वही तारीख होगी, लेकिन सुबह 10.30 बजे।

ध्यान दें कि DateTimeडेलाइट सेविंग टाइम ट्रांज़ेक्शन की अवहेलना करते हैं, दोनों दिशाओं में "भोले" ग्रेगोरियन समय का प्रतिनिधित्व करते हैं ( DateTimeडॉक्स में रिमार्क्स अनुभाग देखें )। एकमात्र अपवाद हैं .Nowऔर .Today: वे वर्तमान सिस्टम समय को पुनः प्राप्त करते हैं जो इन घटनाओं को दर्शाता है जैसे वे होते हैं।

यह उस तरह की बात है जिसने मुझे नोडा टाइम परियोजना शुरू करने के लिए प्रेरित किया, जो अब उत्पादन के लिए तैयार है। इसका ZonedDateTimeप्रकार एक tzडेटाबेस प्रविष्टि से जोड़कर "जागरूक" किया जाता है


11
s.Date.Add (नया टाइमस्पैन (0, 0, 0)) को भी काम करना चाहिए। दिनों के बीच की जाँच करते समय इसका उपयोग करने के लिए।
दही

8
@ user295734: आप Addएक शून्य समय प्रदान करने को क्यों कहेंगे ? आपकी अभिव्यक्ति के बराबर है s.Date, लेकिन अब ...
जॉन स्कीट

इसे ठीक करने के लिए भूल गए, इसे महसूस करने के बाद मैंने इसे कोड में डाल दिया, शून्य पर सेट करने के लिए (जो मैं मूल रूप से खोज रहा था)। लेकिन मैं सिर्फ यह दिखाने की कोशिश कर रहा था कि एक पंक्ति में समय कैसे प्राप्त किया जाए, अगर 0. पर सेट नहीं किया जाता है
दही समझदार

3
यदि आपके पास 2 DateTimeएस हैं, (तारीख के लिए एक और समय के लिए एक) आप ऐसा कर सकते हैं:var result = date.Date + time.TimeOfDay;
ज़ाचरी येट्स

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मॉड्यूल के संदर्भ में Ie एक "भोली" कार्यान्वयन है ।
ivan_pozdeev 11

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

इस तरह आप अपनी तिथि को संरक्षित करते हैं, जबकि अपनी पसंद के अनुसार एक नया घंटे, मिनट और सेकंड का हिस्सा सम्मिलित करते हैं।


@Webleww, निश्चित रूप से जोड़ा गया मूल्यों के आधार पर एक ArgumentOutOfRangeException की दूरस्थ संभावना । यहाँ एक Pex पहेली है जो इसे प्रदर्शित करती है।
लाइफबैलेंस

और उपयोग के मामले के आधार पर, .AddMilliseconds()यदि आवश्यक हो तो भी कर सकते हैं ।
ब्रॉट्स वेम्बम्ब

39

एक लाइन

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

आज दिनांक 4:30:00 के समय के साथ वापस लाएगा, DateTime.Now को किसी दिनांक ऑब्जेक्ट के साथ बदल देगा


22

डेटटाइम एक अपरिवर्तनीय प्रकार है, इसलिए आप इसे बदल नहीं सकते ।

हालाँकि, आप अपने पिछले उदाहरण के आधार पर एक नया DateTime उदाहरण बना सकते हैं। आपके मामले में, ऐसा लगता है कि आपको दिनांक संपत्ति की आवश्यकता है, और आप तब एक 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केवल तारीख मिलती है और समय अवधि मिलती है।


15

सबसे सरल समाधान:

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 जैसी डेटटाइम है और आप 2014/02/05 चाहते हैं, तो आप ऐसा कर सकते हैं:

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

3

जोड़ना। अपनी तिथि के अनुसार इसे आधी रात (00:00) पर सेट करें।

MyDate.Date

नोट समतुल्य SQL हैCONVERT(DATETIME, CONVERT(DATE, @MyDate))

इस पद्धति को इतना अच्छा बनाता है कि यह टाइप करने के लिए त्वरित और पढ़ने में आसान है। एक बोनस यह है कि तार से कोई रूपांतरण नहीं है।

आज की तारीख को 23:30 बजे सेट करने के लिए, उपयोग करें:

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

आप निश्चित रूप से DateTime.Now या MyDate को अपनी पसंद की किसी भी तारीख से बदल सकते हैं।


3

वास्तव में, आप इसे बनाते समय समय नहीं बदल सकते। लेकिन आप इसे कई कंस्ट्रक्टरों के साथ आसानी से बना सकते हैं: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

उदाहरण के लिए, यदि आप एक डेटटाइम चेंजिंग सेकंड बनाना चाहते हैं, तो आप यह कर सकते हैं:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);


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को मूल में जोड़कर सरल बना सकते हैं 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 विधियों का उपयोग करके जोड़ें और घटाएं
क्रिस

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

मैं अभी इस पोस्ट पर आया हूं क्योंकि मेरे पास एक समान मुद्दा था जिसके तहत मैं एमवीसी में एक इकाई फ्रेमवर्क ऑब्जेक्ट के लिए समय निर्धारित करना चाहता था जो कि एक दृश्य (दिनांक) से दिनांक प्राप्त करता है इसलिए समय घटक 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);
  • ऐड विधियों का उपयोग करना

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • Timespan का उपयोग करना

    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 पद्धति में क्या गलत है जहां आप सेकंड जोड़ या बदल सकते हैं?


इतना ही नहीं, लेकिन यह ध्वनि की तरह यह सवाल का जवाब वैसे भी नहीं है। मुझे संदेह है कि ओपी उसी तारीख के साथ डेटटाइम चाहता है लेकिन एक विशिष्ट समय - जो कि AddSeconds का उपयोग करके अपेक्षाकृत कठिन होगा ।
जॉन स्कीट

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

@ जॉन: मैंने टिप्पणी की थी। उपयोगकर्ता को इस कोड का उपयोग करने से पहले कुछ मान निर्दिष्ट करने की आवश्यकता है।
सायर

@SAR: इससे भी महत्वपूर्ण बात यह है कि अब आपने असाइनमेंट्स को वापस एस में जोड़ दिया है (एस.एड. (...) के लिए कॉल को छोड़कर)।
जॉन स्कीट

@ जॉन: मैंने अपना सबक सीखा। आपकी दया और समय के लिए धन्यवाद। वास्तव में मेरा मतलब यह था।
सायर

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
निश्चित रूप से "सर्वश्रेष्ठ" नहीं। दूर से पढ़ने योग्य और एक जादू की संख्या के दोहरावदार उपयोग के साथ।
बार्टोज़केपी

-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)लेकिन इसकी अनुशंसा नहीं करेंगे।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.