আপনি কিভাবে ইউনিক্স এ কনভার্ট করব যুগান্তকারী সময় C # রিয়েল টাইমে মধ্যে? (প্রথম যুগের 1/1/1970)
আপনি কিভাবে ইউনিক্স এ কনভার্ট করব যুগান্তকারী সময় C # রিয়েল টাইমে মধ্যে? (প্রথম যুগের 1/1/1970)
উত্তর:
আমি অনুমান করি যে আপনি ইউনিক্স সময় বলতে চাইছেন , যা 1 ই জানুয়ারি 1970 এর মধ্যরাত (ইউটিসি) থেকে সেকেন্ডের সংখ্যা হিসাবে সংজ্ঞায়িত।
public static DateTime FromUnixTime(long unixTime)
{
return epoch.AddSeconds(unixTime);
}
private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
AddXYZ
পদ্ধতিটি ব্যবহার করুন ।
নেট (v4.6) এর সর্বশেষ সংস্করণ য্বেয্বে বিল্ট-ইন ইউনিক্স সময় রূপান্তরের জন্য সমর্থন। এটিতে ইউনিক্স সময় এবং সেকেন্ড বা মিলিসেকেন্ড দ্বারা প্রতিনিধিত্ব করা উভয়ই অন্তর্ভুক্ত।
DateTimeOffset
:DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
DateTimeOffset
সেকেন্ডে ইউনিক্স সময় থেকে:long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
DateTimeOffset
:DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
DateTimeOffset
মিলিসেকেন্ডে ইউনিক্স সময়:long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
দ্রষ্টব্য: এই পদ্ধতিগুলি রূপান্তর করে এবং সেখান থেকে DateTimeOffset
। DateTime
উপস্থাপনা পেতে কেবল DateTimeOffset.DateTime
সম্পত্তিটি ব্যবহার করুন :
DateTime dateTime = dateTimeOffset.UtcDateTime;
'DateTimeOffset' does not contain a definition for 'FromUnixTimeSeconds'
কীভাবে এটি সমাধান করতে চাই?
লূকএইচকে সমস্ত creditণ দিয়ে, আমি সহজে ব্যবহারের জন্য কিছু এক্সটেনশন পদ্ধতি একসাথে রেখেছি:
public static DateTime FromUnixTime(this long unixTime)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(unixTime);
}
public static long ToUnixTime(this DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date - epoch).TotalSeconds);
}
কোডসইনচাউস থেকে নীচে দেওয়া মন্তব্যটি নোট করুন যে উপরেরটি FromUnixTime
একটি DateTime
দিয়ে একটি Kind
প্রদান করে Utc
, যা ভাল, তবে উপরেরটি আরও বেশি সন্দেহযুক্ত যে প্রদত্ত ToUnixTime
কোন ধরণের জন্য অ্যাকাউন্ট করে না । অনুমতি দেওয়ার জন্য এর সত্তার পারেন বা , ব্যবহার :DateTime
date
date
Kind
Utc
Local
ToUniversalTime
public static long ToUnixTime(this DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}
ToUniversalTime
একটি Local
(বা Unspecified
) রূপান্তর DateTime
করতে হবে Utc
।
আপনি ডেটটাইম থেকে পর্বের দিকে যাওয়ার সময় আপনি যদি যুগের ডেটটাইম উদাহরণটি তৈরি করতে না চান তবে আপনিও করতে পারেন:
public static long ToUnixTime(this DateTime date)
{
return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
ToUnixTime
তারিখটি ইউটিসি তে থাকলে সঠিকভাবে কাজ করে। হয় একটি চেক যোগ করুন, বা এটি রূপান্তর। (ব্যক্তিগতভাবে আমি চেকটি পছন্দ করি)
milliseconds
নয় কাজ করা দরকার !!!
AddMilliseconds
এবং আপনার ডাবল নট ফ্লোট ব্যবহার করা উচিত। অন্যথায় আপনি একটি ভুল সময় শেষ করতে হবে।
আপনি আসলে অ্যাডমিলিসেকেন্ডস (মিলিসেকেন্ডস) চান, সেকেন্ড নয়। সেকেন্ড যোগ করা আপনাকে সীমার বাইরে ব্যতিক্রম দেয়।
AddMillis
তবে আপনি অবশ্যই চান এবং আপনি যদি সেকেন্ড থেকে শুরু করেন তবে আপনি অবশ্যই চান AddSeconds
।
আপনি যদি আরও ভাল পারফরম্যান্স চান তবে আপনি এই সংস্করণটি ব্যবহার করতে পারেন।
public const long UnixEpochTicks = 621355968000000000;
public const long TicksPerMillisecond = 10000;
public const long TicksPerSecond = TicksPerMillisecond * 1000;
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static DateTime FromUnixTimestamp(this long unixTime)
{
return new DateTime(UnixEpochTicks + unixTime * TicksPerSecond);
}
নেট ৪4১ এর অধীনে একটি দ্রুত বেঞ্চমার্ক (বেঞ্চমার্কডটনেট) থেকে আমি এই নম্বরটি পেয়েছি:
Method | Mean | Error | StdDev | Scaled |
-------------- |---------:|----------:|----------:|-------:|
LukeH | 5.897 ns | 0.0897 ns | 0.0795 ns | 1.00 |
MyCustom | 3.176 ns | 0.0573 ns | 0.0536 ns | 0.54 |
লূকএইচ সংস্করণের বিপরীতে 2x দ্রুত (পারফরম্যান্সের ক্ষেত্রে যদি)
এটি ডেটটাইম অভ্যন্তরীণভাবে কীভাবে কাজ করে তার অনুরূপ।
পদ্ধতি ব্যবহার করুন DateTimeOffset.ToUnixTimeMilliseconds () 00:: এটা মিলিসেকেন্ড যে 1970-01-01T00 থেকে অতিবাহিত করেছি সংখ্যা ফেরৎ 00.000Z।
এটি কেবল ফ্রেমওয়ার্ক 4.6 বা ততোধিকের সাথে সমর্থিত
var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
এটি এখানে ডেটটাইমঅফসেট.টোইউনিক্সটাইমমিলিসেকেন্ডগুলি ভালভাবে নথিভুক্ত
অন্য উপায়টি নিম্নলিখিতটি ব্যবহার করা
long EPOCH = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1,0,0,0,0).Ticks;
সেকেন্ডের সাথে EPOCH পেতে আপনি কেবল ব্যবহার করতে পারেন
var Epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
এবং রূপান্তর Epoch
করতে DateTime
নিম্নলিখিত পদ্ধতি সঙ্গে
private DateTime Epoch2UTCNow(int epoch)
{
return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch);
}
.Ticks
দিলে ডেটটাইম বিয়োগ থেকে একটি ভাল টাইমস্প্যান উদাহরণ ফিরে আসবে।
// convert datetime to unix epoch seconds
public static long ToUnixTime(DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}
ডেটটাইম অবজেক্টের জন্য ToUniversalTime () ব্যবহার করা উচিত।
আমি যুগের রূপান্তরের জন্য নিম্নলিখিত এক্সটেনশন পদ্ধতিগুলি ব্যবহার করি
public static int GetEpochSeconds(this DateTime date)
{
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
return (int)t.TotalSeconds;
}
public static DateTime FromEpochSeconds(this DateTime date, long EpochSeconds)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(EpochSeconds);
}
মিলিসেকেন্ড বা সেকেন্ড ব্যবহারের বিষয়ে চিন্তা না করার জন্য কেবল এটি করুন:
public static DateTime _ToDateTime(this long unixEpochTime)
{
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var date = epoch.AddMilliseconds(unixEpochTime);
if (date.Year > 1972)
return date;
return epoch.AddSeconds(unixEpochTime);
}
যদি যুগের সময়টি সেকেন্ডে হয় তবে আপনি 1972 মিলিসেকেন্ড যুক্ত করে বছর পাস করার কোনও উপায় নেই।
আপনি যদি 4.6 ব্যবহার না করে থাকেন তবে এটি উত্স: System.IdentityModel.Tokens সহায়তা করতে পারে
/// <summary>
/// DateTime as UTV for UnixEpoch
/// </summary>
public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
/// <summary>
/// Per JWT spec:
/// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time.
/// </summary>
/// <param name="datetime">The DateTime to convert to seconds.</param>
/// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks>
/// <returns>the number of seconds since Unix Epoch.</returns>
public static long GetIntDate(DateTime datetime)
{
DateTime dateTimeUtc = datetime;
if (datetime.Kind != DateTimeKind.Utc)
{
dateTimeUtc = datetime.ToUniversalTime();
}
if (dateTimeUtc.ToUniversalTime() <= UnixEpoch)
{
return 0;
}
return (long)(dateTimeUtc - UnixEpoch).TotalSeconds;
}
using Microsoft.IdentityModel.Tokens; ... EpochTime.GetIntDate(dateTime);
যদি আপনি একটি রূপান্তর করতে হবে timeval struct হয় (সেকেন্ড, মাইক্রোসেকেন্ড) ধারণকারী UNIX time
করার DateTime
স্পষ্টতা হারানো ছাড়া, এই হল কিভাবে:
DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private DateTime UnixTimeToDateTime(Timeval unixTime)
{
return _epochTime.AddTicks(
unixTime.Seconds * TimeSpan.TicksPerSecond +
unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000);
}
নেট 4.. and এবং তারপরে দয়া করে ডেটটাইমঅফসেট.নিউ. টো ইউনিক্সটাইমসেকেন্ডস () ব্যবহার করুন
এখানে আমার সমাধান:
public long GetTime()
{
DateTime dtCurTime = DateTime.Now.ToUniversalTime();
DateTime dtEpochStartTime = Convert.ToDateTime("1/1/1970 0:00:00 AM");
TimeSpan ts = dtCurTime.Subtract(dtEpochStartTime);
double epochtime;
epochtime = ((((((ts.Days * 24) + ts.Hours) * 60) + ts.Minutes) * 60) + ts.Seconds);
return Convert.ToInt64(epochtime);
}