আমি কীভাবে ডেটটাইমকে ওয়েব ইউটিসি ফর্ম্যাটে ফর্ম্যাট করতে পারি?


90

আমার একটি ডেটটাইম রয়েছে যা আমি " 2009-09-01T00:00:00.000Z" এ ফর্ম্যাট করতে চাই , তবে নিম্নলিখিত কোডটি আমাকে " 2009-09-01T00:00:00.000+01:00" (উভয় লাইন) দেয়:

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")

কোনও ধারণা কীভাবে এটি কাজ করবে?

উত্তর:


165
string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

4
@ ডাউনভোটার: আপনি কি এই উত্তরটির সাথে ভুল বলে মনে করেন?
লুক

12
এটি কাজ করেছে তবে .ToUniversalTime () আপনার বিদ্যমান তারিখটিকে জবাব দিবে যদি এটি ইতিমধ্যে ইউটিসি তে থাকে তবে আপনার ডেটটাইম ভেরিয়েবলটি এটি নির্দিষ্ট করে না। আমি .ToUniversalTime () অপসারণ শেষ করেছি এবং তারিখগুলি তখন উভয় প্রান্তে (ডাটাবেস এবং ওয়েব ক্লায়েন্ট) যা প্রত্যাশা করা হয়েছিল তার সাথে সারিযুক্ত।
রবিন ভেসে

10
যদি আপনার তারিখের সময়টি ইতিমধ্যে সার্বজনীন সময় হয় তবে .ToUniversalTime()আপনি যা চান তার কল করতে পারেন, এটি এটি পরিবর্তন করবে না। - তবে, যদি আপনি স্থানীয় সময় হিসাবে সঞ্চিত সর্বজনীন সময়ের মান পেয়ে থাকেন তবে অবশ্যই এটি পরিবর্তন হয়ে যাবে (তবে সেই ক্ষেত্রে আপনাকে মোকাবেলা করতে আরও বড় সমস্যা হয়েছে!) - যাইহোক, এই উত্তরটি হ'ল ভয়ানক. "O"পরিবর্তে, নীচের উত্তর দ্বারা নির্দিষ্ট হিসাবে ফর্ম্যাট স্ট্রিংটি ব্যবহার করা উচিত ।
BrainSlugs83

4
@ BrainSlugs83 এই "ভয়ংকর" উত্তর আসলে ওপি তারা যা চেয়েছিল দেয়: 2009-09-01T00:00:00.000Z। "O" কে সুনির্দিষ্টভাবে উল্লেখ করা ব্যবহার করে সেগুলি ভিন্ন কিছু দিতে হবে: 2009-09-01T00:00:00.0000000Z
লুক


75

কেন কেবলমাত্র রাউন্ড-ট্রিপ ("O", "o") ফর্ম্যাট স্পেসিফায়ার ব্যবহার করবেন না ?

"ও" বা "ও" স্ট্যান্ডার্ড ফর্ম্যাট স্পেসিফায়ার এমন একটি প্যাটার্ন ব্যবহার করে একটি কাস্টম তারিখ এবং সময় বিন্যাসের স্ট্রিং উপস্থাপন করে যা সময় অঞ্চল তথ্য সংরক্ষণ করে এবং ISO 8601 এর সাথে সম্মতিযুক্ত ফলাফলের স্ট্রিংটি প্রেরণ করে Date ডেটটাইম মানগুলির জন্য, এই বিন্যাস নির্দিষ্টকরণটি তারিখ সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে তারিখটাইম সহ টাইম মানসমূহ text মূল পাঠ্যে টাইপ করুন। স্টাইলের প্যারামিটারটি ডেটটাইমসাইলস.রউন্ডট্রিপকাইন্ডে সেট করা থাকলে ফরম্যাট করা স্ট্রিংটি ডেটটাইম.পার্স (স্ট্রিং, আইফর্ম্যাটপ্রোভাডার, ডেটটাইমস্টাইলস) বা ডেটটাইম. পার্সেক্স্যাক্ট পদ্ধতি ব্যবহার করে আবার পার্স করা যায়।

"O" বা "o" স্ট্যান্ডার্ড ফর্ম্যাট স্পেসিফায়ারটি "yyyy" - 'এমএম' - 'dd'T'HH': 'মিমি': 'এসএস' এর সাথে মিলে যায় f fffffffK "ডেটটাইম মানগুলির জন্য কাস্টম বিন্যাসের স্ট্রিং এবং "yyyy '-' এমএম '-' dd'T'HH ':' মিমি ':' এসএস '।' fffffffzzz" ডেটটাইম অফসেট মানগুলির জন্য কাস্টম ফর্ম্যাট স্ট্রিং। এই স্ট্রিংয়ে, একক উদ্ধৃতি চিহ্নগুলির জোড়গুলি যা পৃথক অক্ষরগুলি যেমন হাইফেনস, কোলোনস এবং "T" অক্ষরকে সীমাবদ্ধ করে তা নির্দেশ করে যে স্বতন্ত্র চরিত্রটি আক্ষরিক যা পরিবর্তিত হতে পারে না। আউটপুট স্ট্রিং-এ অ্যাডাস্ট্রোফস উপস্থিত হয় না।

ও "বা" ও "স্ট্যান্ডার্ড ফর্ম্যাট স্পেসিফায়ার (এবং" yyyy '-' এমএম '-' dd'T'HH ':' মিমি ':' এসএস '।' fffffffK "কাস্টম ফর্ম্যাট স্ট্রিং) তিনটি উপায়ে সুবিধা গ্রহণ করে আইএসও 8601 তারিখটাইম মানগুলির ধরণের সম্পত্তি সংরক্ষণের জন্য সময় অঞ্চল তথ্য উপস্থাপন করে:

public class Example
{
   public static void Main()
   {
       DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                   DateTimeKind.Unspecified);
       Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

       DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Utc);
       Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind);

       DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Local);
       Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind);

       DateTimeOffset dto = new DateTimeOffset(lDat);
       Console.WriteLine("{0} --> {0:O}", dto);
   }
}
// The example displays the following output: 
//    6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
//    6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
//    6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//     
//    6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00

কারণ এটি অনুরোধ অনুযায়ী কাজ করে না, আপনি সর্বোপরি এটিকে উদ্ধৃত করেছেন - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" জুলু ফর্ম্যাট নয়।
নভোচারী

@astroalker এটি কাজ করা উচিত তিনি তার উত্তরে আপনাকে একাধিক বিকল্প দিয়েছেন। আপনার কেবল একটি বাছাই করা দরকার। আপনার ক্ষেত্রে (এবং অপের ক্ষেত্রে), আপনি ডেটটাইমকাইন্ড ব্যবহার করবেন would শেষের দিকে "জেড" দিয়ে স্ট্রিং উত্পাদন করার জন্য (ওরফে "জুলু ফর্ম্যাট" বা "ইউটিসি সময়")। শুধু ইউটিসির জন্য তার উদাহরণ আউটপুট দেখুন। আমার ক্ষেত্রে, আমি ব্যবহার করেছি: dtVariable.ToUniversalTime().ToString("o")যা রূপান্তরিত হবে "2019-05-26T19:50:34.4400000Z"বা "yyyy-MM-ddTHH:mm:ss.fffffffZ"। দ্রষ্টব্য: আমি জাভাস্ক্রিপ্টের new Date(dtDateString).getTime()পদ্ধতিতে এটিও পরীক্ষা করেছি এবং এটি এর দ্বারা উত্পাদিত তারিখের স্ট্রিংকে সঠিকভাবে পার্স করে।
মাইকটিভি

@ মাইকটিভি, আমি কেবলমাত্র নির্দেশিত ছিলাম যে প্রদত্ত সমাধানগুলি কাজ করবে না (ডিটিওর জন্য)। উপযুক্ত উপায় হয় dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")। রেকর্ডের জন্য, কেবল "o"অফসেট যুক্ত করুন, এটি জুলু ফর্ম্যাট নয়।
নভোচারী

4
যারা স্ট্রিং ট্রান্সফর্মেশন করার চেষ্টা করছেন তাদের জন্য:$"{DateTime.UtcNow:O}"
টিয়াগো সিজার ওলিভিরা

19
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

2017-02-10T08: 12: 39.483Z ফিরে আসে


fffপরিবর্তে আপনাকে ব্যবহার করতে হবে FFFবা 000 চিহ্নটি এক সেকেন্ডের জন্য প্রদর্শিত হবে না।
রায়ান লুন্ডি

6

ব্যবহারের জন্য সেরা ফর্ম্যাটটি হ'ল "yyyy '-' MM '-' dd'T'HH ':' মিমি ':' এসএস '' 'fffK"।

তারিখটি ইউটিসি হলে বা টাইমজোন (+ -hh: মিমি) স্থানীয় হলে স্ট্রিংয়ের শেষ কেটি 'জেড' এ পরিবর্তিত হবে। ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )

যেমন লূকএইচ বলেছেন, আপনি সমস্ত তারিখটি ইউটিসি হতে চাইলে ToUniversalTime ব্যবহার করা ভাল।

চূড়ান্ত কোডটি হ'ল:

string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");

6

কিছু লোক চিহ্নিত করেছেন যে 'টু ইউনভার্সালটাইম' কিছুটা অনিরাপদ যে এটি অনিচ্ছাকৃত ভুল সময় বিভেদ সৃষ্টি করতে পারে। এর প্রসারিত করে আমি একটি সমাধানের আরও বিশদ উদাহরণ সরবরাহ করছি। এখানে নমুনাটি ডেটটাইম অবজেক্টে একটি এক্সটেনশন তৈরি করে যা নিরাপদে একটি ইউটিসি ডেটটাইম ফিরিয়ে দেয় যেখানে আপনি টসস্ট্রিংকে পছন্দসই হিসাবে ব্যবহার করতে পারেন…।

class Program
{
    static void Main(string[] args)
    {
        DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc);
        DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified);

        //Sample of an unintended mangle:
        //Prints "2016-06-01 10:17:00Z"
        Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUtc.SafeUniversal().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUnspecified.SafeUniversal().ToString("u"));
    }
}

public static class ConvertExtensions
{
    public static DateTime SafeUniversal(this DateTime inTime)
    {
        return (DateTimeKind.Unspecified == inTime.Kind)
            ? new DateTime(inTime.Ticks, DateTimeKind.Utc)
            : inTime.ToUniversalTime();
    }
}

5

আপনি ডেটটাইম অফসেট ক্লাসটি ব্যবহার করতে চান ।

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L));
var stringDate = date.ToString("u");

দুঃখিত আমি মিলিসেকেন্ডগুলির সাথে আপনার মূল ফর্ম্যাটিংটি মিস করেছি

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

5

এই কোডটি আমার পক্ষে কাজ করছে:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local);
var text = datetime.ToString("o");
Console.WriteLine(text);
--  2017-10-27T14:45:53.1750000+03:00

// datetime from string
var newDate = DateTime.ParseExact(text, "o", null);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.