মিলি সেকেন্ডের নির্ভুলতার সাথে এখন ডেটটাইম পান


231

মিলিসেকেন্ড যথার্থতার সাথে আমি কীভাবে প্রকৃত সময়ের একটি স্ট্যাম্প তৈরি করতে পারি?

আমার 16.4.2013 9: 48: 00: 123 এর মতো কিছু দরকার। এটা কি সম্ভব? আমার একটি অ্যাপ্লিকেশন রয়েছে, যেখানে আমি প্রতি সেকেন্ডে 10 বারের নমুনা পাই এবং আমাকে সেগুলি গ্রাফে প্রদর্শিত করতে হবে।



সচেতন থাকুন যে বেশ কয়েকটি উত্তর hhঘন্টা (মানক সময়) এর জন্য ব্যবহার করছে। টাইমস্ট্যাম্পের ক্ষেত্রে (এবং অন্যান্য অনেক ক্ষেত্রে) এটি সম্ভবত tt(সকাল / বিকাল) জোড় করা উচিত বা এর পরিবর্তে HH(সামরিক সময়) তৈরি করা উচিত।
goz

উত্তর:


304

মিলিসেকেন্ড যথার্থতার সাথে আমি কীভাবে প্রকৃত সময়ের একটি স্ট্যাম্প তৈরি করতে পারি?

আমি সন্দেহ করি আপনি মিলিসেকেন্ড যথার্থতা বলতে চাইছেন । DateTimeঅনেক নির্ভুলতা রয়েছে তবে নির্ভুলতার ক্ষেত্রে এটি মোটামুটি মোটা। সাধারণভাবে বলতে গেলে, আপনি পারবেন না। সাধারণত সিস্টেমের ঘড়ির (যেখান DateTime.Nowথেকে এর ডেটা পাওয়া যায়) এর রেজুলেশন প্রায় 10-15 এমএস হয়। আরও তথ্যের জন্য নির্ভুলতা এবং নির্ভুলতা সম্পর্কে এরিক লিপার্টের ব্লগ পোস্টটি দেখুন।

আপনার যদি এর চেয়ে আরও সঠিক সময় প্রয়োজন হয় তবে আপনি কোনও এনটিপি ক্লায়েন্ট ব্যবহার করে দেখতে পারেন।

যাইহোক, এটি পরিষ্কার নয় যে এখানে আপনার সত্যিই মিলিসেকেন্ড যথার্থতা প্রয়োজন। আপনি যদি সঠিক সময়টির বিষয়ে চিন্তা না করেন - আপনি "বেশ ভাল" যথার্থতার সাথে সঠিক ক্রমে নমুনাগুলিটি প্রদর্শন করতে চান, তবে সিস্টেমের ঘড়িটি ঠিক হওয়া উচিত। দিবালোক সংরক্ষণের ট্রানজিশন ইত্যাদির সময়কালীন সমস্যাগুলি এড়াতে আমি আপনাকে DateTime.UtcNowবরং ব্যবহার করার পরামর্শ দেবDateTime.Now

যদি আপনার প্রশ্নটি আসলেDateTime মিলিসেকেন্ডের নির্ভুলতার সাথে একটি স্ট্রিংয়ে রূপান্তর করার প্রায় কাছাকাছি হয় তবে আমি এটি ব্যবহার করার পরামর্শ দিই:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

(মনে রাখবেন যে আপনার নমুনার বিপরীতে, এটি বাছাইযোগ্য এবং এটি "মাস / দিন / বছর" বা "দিন / মাস / বছর" হিসাবে বোঝানো হয়েছে কিনা তা ঘিরে বিভ্রান্তির কারণ কম))


5
@ অ্যান্টোনিও: "কাজ করে না" এর চেয়ে বেশি তথ্য ছাড়া আমি আর কোনও সহায়তা দিতে পারি না।
জন স্কিটি 1'18

হ্যাঁ, আমি আরও তথ্য সরবরাহ করতে পারি: "{0: yyyyMMdd এইচ: মিমি: এসএসএফএফএফ}", ডেটটাইম.ইউটিসিউ -> 20180502 11: 07: 20.000 উইন 32. গেটসিসটেমটাইম (রেফ স্টাইম) -> 2018,2,5,11 , 7,20,0 (ymdh মিমি এসএস এমএস) আমি মিলি সেকেন্ডের সাথে তারিখের সময়ের একটি উদাহরণ তৈরি করতে পারি: var dt = নতুন ডেটটাইম (2018, 5, 2, 19, 34, 55, 200); "{0: yyyyMMdd HH: mm: ss.fff}", dt -> 20180502 19: 34: 55.200। নেট কমপ্যাক্ট ফ্রেমওয়ার্ক, উইন্ডোজ এম্বেডড কমপ্যাক্ট 7, এআরএম কর্টেক্স-এ 8
এন্টোনিও

@ অ্যান্টোনিও: সুতরাং এটি .NET এর সংস্করণ বলে মনে হচ্ছে আপনি যে হার্ডওয়্যারটি ব্যবহার করছেন তা কেবল সাবসেকেন্ডের নির্ভুলতা সরবরাহ করে না - অথবা আপনি এটি দ্বিতীয় সীমাতে কল করেছিলেন। (আপনি যদি DateTime.UtcNowবার বার আঘাত করতে থাকেন তবে প্রতি সেকেন্ডে এটি কি কেবল একবারই বৃদ্ধি পায়? আপনি তা দেখাননি))
জন স্কিটি

আমি যখন ডেটটাইম থেকে এখন টিকগুলি পুনরুদ্ধার করি ow সীমাবদ্ধতাটি হার্ড / সফ্টওয়্যারটিতে রয়েছে বলে আমি মনে করি। আমি স্টপওয়াচ ক্লাসটি ব্যবহার করেছি, পরিবর্তে ধন্যবাদ জন
আন্তোনিও

@ অ্যান্টোনিও: সম্ভবত এই মুহুর্তে জড়িত ডিভাইসের পুরো বিশদ সহ একটি নতুন প্রশ্ন তৈরি করা উপযুক্ত।
জন স্কিটি

117

এই কাজ করা উচিত:

DateTime.Now.ToString("hh.mm.ss.ffffff");

আপনার যদি এটি প্রদর্শনের প্রয়োজন হয় না এবং কেবল সময়ের পার্থক্যটি জানতে হয় তবে ভালভাবে এটি একটি স্ট্রিংয়ে রূপান্তর করবেন না। শুধু এটি হিসাবে ছেড়ে দিন,DateTime.Now();

এবং TimeSpanসময়ের ব্যবধানের মধ্যে পার্থক্যটি জানতে ব্যবহার করুন :

উদাহরণ

DateTime start;
TimeSpan time;

start = DateTime.Now;

//Do something here

time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));

আমার এটির সাথে গণনা করা দরকার, তাই আমি এটিকে স্ট্রিংয়ে রূপান্তর করতে পারি না।
ভাগ্যবান এইচকে

25

আমি একটি অনুরূপ সমাধানের সন্ধান করছিলাম, এই থ্রেডে যা পরামর্শ দেওয়া হয়েছিল তার ভিত্তিতে, আমি নিম্নলিখিতটি ব্যবহার করি DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") এবং এটি কবজির মতো কাজ করে। দ্রষ্টব্য: .fffএটি হ'ল নির্ভুল সংখ্যা যা আপনি ক্যাপচার করতে চান।


1
তারিখটি বিকেলে হলে (4PM) সকালে হিসাবে দেখায়। ফিক্স: ব্যবহার HH(সামরিক সময়) বা যোগ করুন tt(প্রধানমন্ত্রী বা এএম)। এই উদাহরণে দেখানো হিসাবে: repl.it/KGr3/1
Jaider

22

মিলি সেকেন্ডের সাথে ডেটটাইম স্ট্রাকচার ব্যবহার করুন এবং এর মতো করুন:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");

16

পাইরোম্যান্সারের উত্তরটি আমার কাছে বেশ ভাল মনে হয়েছে তবে আপনি চেয়েছিলেন:

DateTime.Now.Millisecond

তবে আপনি যদি তারিখগুলির সাথে তুলনা করছেন, টাইমস্প্যান হ'ল উপায়।


15
দ্রষ্টব্য: আপনি যদি টাইমস্প্যান হিসাবে দুটি ডেটটাইমগুলির মধ্যে পার্থক্যটি তুলনা করেন তবে আপনার প্রয়োজন TotalMilliseconds। মিলিসেকেন্ডগুলির বর্তমান মিলিসেকেন্ডগুলির কাউন্টার রয়েছে, যা কখনই 1000 এর বেশি নয়, যখন টোটালমিলিসেকেন্ডগুলি মোট যুগের আগে থেকে মিলিয়ে যায় মোট মিলিসেকেন্ডগুলি holds
কনটাঙ্গো

4

আপনি যদি এখনও অন্যান্য উত্তরের মতো স্ট্রিংয়ের পরিবর্তে একটি তারিখ চান তবে কেবল এই এক্সটেনশন পদ্ধতিটি যুক্ত করুন।

public static DateTime ToMillisecondPrecision(this DateTime d) {
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
                        d.Second, d.Millisecond, d.Kind);
}

3

আমি যতদূর প্রশ্নটি বুঝতে পেরেছি, আপনি যেতে পারেন:

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

এটি 1 মিলিসেকেন্ডের চেয়ে ছোট টিক্স কেটে ফেলবে।


হ্যাঁ, তবে ডেটটাইম-এর প্রকৃত রেজোলিউশন ow এখন প্রায় 16 এমএসের বেশি নাও হতে পারে।
পিটার মর্টেনসেন

2

সমস্যা DateTime.UtcNowএবং DateTime.Nowযে, কম্পিউটার উপর নির্ভর করে এবং সিস্টেম অপারেটিং, এটি শুধুমাত্র সঠিক 10 থেকে 15 মধ্যে এবং মিলিসেকেন্ড হতে পারে। যাইহোক, উইন্ডোজ কম্পিউটারগুলিতে মাইক্রোসেকেন্ড যথার্থতা পেতে নিম্ন স্তরের ফাংশন গেটসিস্টেমটাইমপ্রিসাইজ এএসফাইলটাইম ব্যবহার করে আপনি ব্যবহার করতে পারেন , GetTimeStamp()নীচের ফাংশনটি দেখুন।

    [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
    static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct FileTime  {
        public const long FILETIME_TO_DATETIMETICKS = 504911232000000000;   // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
        public uint TimeLow;    // least significant digits
        public uint TimeHigh;   // most sifnificant digits
        public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } }     // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
        public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
    }

    public static DateTime GetTimeStamp() { 
        FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
        return ft.dateTime;
    }

তোমাকে অনেক ধন্যবাদ. আমি এটিকে এতক্ষণ অনুসন্ধান করে যাচ্ছি। এটি কোনও কর্মক্ষমতা সংক্রান্ত সমস্যার কারণ এবং এটি উত্পাদন কোড ব্যবহার করা নিরাপদ?
মুহাম্মাদ গ্যাক্টর্ক আয়ান

0

ডেটটাইম.নো টিক্স ব্যবহার করে দেখুন। এটি ন্যানোসেকেন্ডের নির্ভুলতা সরবরাহ করে। দুটি টিকের ডেল্টা নেওয়া (স্টপটিক - স্টার্টটিক) / 10,000 নির্দিষ্ট ব্যবধানের মিলসেকেন্ড।

https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2


-2
public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

আপনি যদি মাইক্রোসেকেন্ডগুলি চান তবে কেবল পরিবর্তন 10000করুন 10এবং আপনি যদি মাইক্রোয়ের 10 তম চান তবে মুছুন / 10000


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