সি # তে একটি টাইমস্ট্যাম্প তৈরি করে এমন ফাংশন


101

আমি ভাবছিলাম, সি # তে একটি টাইমস্ট্যাম্প তৈরির কোনও তারিখের সময় থেকে কোনও উপায় আছে কি? আমার একটি মিলিসেকেন্ড যথার্থ মান প্রয়োজন যা কমপ্যাক্ট ফ্রেমওয়ার্কেও কাজ করে (যেটি ডেটটাইম. টোবাইনারি () সিএফ-তে বিদ্যমান নয়)।

আমার সমস্যাটি হ'ল আমি এই মানটি একটি অজানাস্টিক উপায়ে সংরক্ষণ করতে চাই যাতে আমি এটি পরে বাছাই করতে পারি এবং অন্যটির থেকে কোন মানটি আরও বেশি তা নির্ধারণ করতে পারি etc.


2
গৃহীত উত্তর এখানে একটা চমৎকার সমাধান দেয়, কিন্তু আপনি একটি বাস্তব টাইমস্ট্যাম্প চাই, এই প্রশ্ন / এ চেক আউট: stackoverflow.com/questions/9814060/...
inanutshellus

উত্তর:


206

আমি সবসময় নিম্নলিখিতগুলির মতো কিছু ব্যবহার করি:

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

এটি আপনাকে ২০০05211035131468 এর মতো স্ট্রিং দেবে, কারণ স্ট্রিংটি টাইমস্ট্যাম্পের সর্বোচ্চ অর্ডার বিট থেকে সর্বনিম্ন অর্ডার বিট থেকে আপনার এসকিউএল কোয়েরিতে সর্ট স্ট্রিংকে তারিখ অনুসারে অর্ডার করতে ব্যবহার করা যেতে পারে যদি আপনি কোনও ডাটাবেসে মান আঁকেন তবে


5
আপনি কীভাবে 21 মাস পাচ্ছেন এবং কেবল 12 পাবেন? :)
পলবি

2
বছরের জন্য টোকেনটি এখানে ছোট হাতের অক্ষর হওয়া উচিত: রিটার্ন মান T টোস্ট্রিং ("yyyyMMddHHmmssffff");
ডন কোট 21

1
@ রবভি প্রশ্নটি মিলিসেকেন্ড যথার্থতার জন্য জিজ্ঞাসা করে, তাই আপনার শেষে 3 f f এর দরকার। আপনার 4 'f এর 100 মাইক্রোসেকেন্ড যথার্থতা দেয়।
ইউজিন বেরেসোভস্কি

2
সচেতন হোন, যে কমপ্যাক্ট ফ্রেমওয়ার্কটি মিলিসেকেন্ডগুলি স্থানান্তর করে না। এগুলি সর্বদা 0. থাকবে You আপনাকে কোডটি মোড করতে হবে এবং এর মতো কিছু যুক্ত করতে হবে: int টিক = এনভায়রনমেন্ট। টিককাউন্ট% 1000; int এমএস = (টিক> = মোফসেট)? (টিক - মোফসেট): (1000 - (মোফসেট - টিক)); এমএস = ম্যাথ.মিন (999, ম্যাথ.ম্যাক্স (0, এমএস));
রেডউল্ফ

43

আমি বিশ্বাস করি আপনি নিম্নলিখিতটি ব্যবহার করে এক সেকেন্ডের সাথে সঠিকভাবে একটি ইউনিক্স স্টাইলের ডেটস্ট্যাম্প তৈরি করতে পারেন

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

ডিনোমিনেটর সামঞ্জস্য করা আপনাকে আপনার স্তরের নির্ভুলতার স্তর চয়ন করতে দেয়


19

আপনি ডেটটাইম.টিক্স সম্পত্তি ব্যবহার করতে পারেন যা একটি দীর্ঘ এবং সর্বজনীন স্ট্যাবল, সর্বদা ক্রমবর্ধমান এবং কমপ্যাক্ট ফ্রেমওয়ার্কে ব্যবহারযোগ্য। কেবলমাত্র আপনার কোডটি 31 ডিসেম্বর 9999 এর পরে ব্যবহার করা হয়নি তা নিশ্চিত করুন;)


আপনি যখন "সর্বদা বৃদ্ধি" বলছেন - ডেটটাইমকে দুটি কল করার কোনও গ্যারান্টি নেই tউত্তন নোট.টিক্স যদিও বিভিন্ন মান দেয় তবে কি আছে? অন্য কথায় এটি অনন্য টাইমস্ট্যাম্প হিসাবে ব্যবহার করার আগে আপনার এখনও কিছুটা সাবধানতার প্রয়োজন।
জন স্কিটি

9
@ কনস্টান্টিনোস: আপনি টাইমস্ট্যাম্প ব্যবহার করলে আপনি সদৃশগুলি এড়াতে পারবেন না। টাইমস্ট্যাম্পগুলি অনন্য কীগুলির জন্য ব্যবহৃত হয় না, তবে একটি সময় চিহ্নিত করার জন্য। আপনি বলেছিলেন যে আপনার মিলিসেকেন্ড যথার্থতা প্রয়োজন, এবং টিক্সের 100ns নির্ভুলতা রয়েছে। জিনিসটি হ'ল আপনার সদৃশ হবে। আপনি যদি না চান যে আপনার ডিবিতে একটি অনন্য ক্রম প্রয়োজন, যা দুর্ভাগ্যক্রমে ডিবি অজ্ঞেয় নয়।
ফ্রান্সস বউমা

3
"এটি একটি আসল টিক গণনা যা সময়ের সাথে সাথে বৃদ্ধি পায়"। তবে সিস্টেমের ঘড়িটি পিছন দিকে যেতে পারে - যেমন আপনি স্থানীয় সময় ব্যবহার করে থাকেন বা সিস্টেম ঘড়িটি সামঞ্জস্য করা হয়েছিল তাই দিবালোক সংরক্ষণের শেষে saving
জো

1
@ ফ্রান্স: একেবারে। আমি কেবল মন্তব্যটি করেছি কারণ লোকেরা তাদের চয়ন করা সমাধানের প্রভাব সম্পর্কে চিন্তা করা উচিত। উদাহরণস্বরূপ, আমি কমপক্ষে ডিএসটি সমস্যাগুলি দূর করতে স্থানীয় সময়ের চেয়ে ইউটিসি ব্যবহার করব।
জো

1
@ কনস্টান্টিনোস: হুম ... ডক্স বলছে এটির ১০০ স্পষ্টতা রয়েছে, সুতরাং এটি অদ্ভুত যে ডকুমেন্ট হিসাবে এটি যথার্থতা নেই। সম্ভবত এটি প্রকৃতই কমপ্যাক্ট কাঠামো, এটি কোনও বাগ ছাড়াই কোনও কাঠামো নয়
ফ্রান্সস বউমা


4

যখন আপনার সেকেন্ডে টাইমস্ট্যাম্পের প্রয়োজন হয়, আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;

2

যদি আপনি এমন টাইমস্ট্যাম্পগুলি চান যা প্রকৃত আসল সময়ের সাথে মিলে যায় তবে বুটগুলিও অনন্য হতে চায় (প্রদত্ত অ্যাপ্লিকেশনটির জন্য), আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

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