Saturday, September 06, 2008

Software Development ေ၀ါဟာရမ်ား - Epoch Time

အပ္ေပါ့ခ္ လို႔ အသံထြက္ပါတယ္။ ကြန္ျပဴတာေတြမွာ အခ်ိန္ ရက္စြဲေတြ သိမ္းတဲ့ အခါ `၆ စက္တင္ဘာ ၂၀၀၈ ည ၁၀ နာရီ ၄၃ မိနစ္ ၁၇ စကၠန္႕´ လို႔ သိမ္းမည့္အစား ကိန္းဂဏန္း တစ္ခုအေနနဲ႔ (ဥပမာ) `၁၂၂၀၇၀၄၉၉၇´ လို႔ သိမ္းပါတယ္။ အဲဒီ ကိန္းဂဏန္းဟာ စကၠန္႕ (သို႔မဟုတ္ မီလီ စကၠန္႕) အေရအတြက္ပါ။ အဲဒီလို သိမ္းဖို႔ အတြက္ အခ်ိန္ တစ္ခုကို သတ္မွတ္ၿပီး အဲဒီ အခ်ိန္ကေန စၿပီး စကၠန္႔ေပါင္း ဘယ္ေလာက္ ႐ွိၿပီ ဆိုတာကို ေရတြက္ပါတယ္။ ဥပမာ Unix ကြန္ျပဴတာေတြမွာ ၁၉၇၀ ဇန္န၀ါရီလ ၁ ရက္ေန ညသန္းေခါင္ လြဲၿပီး အခ်ိန္ကေန စၿပီး စကၠန္႔ ဘယ္ေလာက္ ႐ွိၿပီ ဆိုတာကို ေရတြက္ၿပီး ကိန္းဂဏန္း တစ္ခု အေနနဲ႔ သိမ္းပါတယ္။ ကြန္ျပဴတာေတြမွာ အဲဒီ တန္ဖိုးကို 32 bits ဂဏန္းနဲ႔ သိမ္းပါတယ္။ ဘယ္ေလာက္ႀကီးႀကီး သိမ္းလို႔ ရလဲ ဆိုေတာ့ ၂ - ၃၁ ထပ္ကိန္း (2 power 31) အထိ ထိ သိမ္းလို႔ ရပါတယ္။ ေ႐ွ႕ဆံုး bit က (+/-) Sign အတြက္ပါ။

ကြန္ျပဴတာ ေလာက အျပင္ Epoch ကို တျခား ေနရာေတြမွာ သံုးပါေသးတယ္။ Epoch ရဲ႕ အဓိပၸါယ္ေတြကေတာ့ (၁) သမိုင္း - ေခတ္ တစ္ေခတ္၏ အစ။ (၂) နကၡေဗဒ - Big Bang ၿပီးေတာ့ စၾက၀ဠာ၏ ဖြံ႕ၿဖိဳးမႈ။ (၃) ဘူမိေဗဒ - ပညာမွာ သံုးေသာ Time Scale တစ္ခု (Eon > Era > Period > Epoch > Stage) Era တစ္ခုမွ Period ေတြ တစ္ခုမက ႐ွိၿပီး Period တစ္ခုမွာ Epoch ေတြ တစ္ခုမက ႐ွိတယ္ စသည္ စသည္ ဆိုခ်င္တာပါ။

Programmer တစ္ေယာက္အေနနဲ႔ ကိုယ္သံုးတဲ့ Programming Language မွာ Date Time ေတြအတြက္ Epoch Time ကို သိထားသင့္ပါတယ္။ Java၊ PHP နဲ႔ JavaScript တို႔က Unix ရဲ႕ Epoch Time အတိုင္းပါ။ Java မွာ မီလီစကၠန္႕ အေရအတြက္နဲ႔ သိမ္းပါတယ္။ အဲဒါေၾကာင့္ 64 bits ကိန္း ျဖစ္တဲ့ long - data type နဲ႔ သိမ္းပါတယ္။ Microsoft က .Net Programming language ေတြမွာလည္း အခ်ိန္ကို 64 bits ကိန္းနဲ႔ သိမ္းေပမယ့္ သူ႔ရဲ႕ Epoch Time က ၁၂း၀၀ AM (၀၀:၀၀) ဇန္န၀ါရီလ ၁ ရက္ ၀၀၀၁ ျဖစ္ပါတယ္။ သူက Ticks လို႔ေခၚတဲ့ 100 nano second အေရအတြက္နဲ႔ သိမ္းပါတယ္။ ၁ စကၠန္႔မွာ ၁၀၀၀ မီလီ စကၠန္ ႐ွိပါတယ္။ ၁ မီလီ စကၠန္႕မွာ ၁၀၀၀ (Ticks/100 nsec) ႐ွိပါတယ္။ Windows မွာ File ေတြ အတြက္ Date Time က Epoch Time က ဇန္န၀ါရီ ၁ ၁၆၀၁ ကေန စၿပီး Ticks နဲ႔ ေရတြက္ၿပီး System Date Time ကေတာ့ .Net မွာလိုပါပဲ။ Apple က Mac အသစ္ေတြ ကေတာ့ ဇန္န၀ါရီ ၁ ရက္ ၂၀၀၁ ကေနစၿပီး Mac အေဟာင္းေတြကေတာ့ ဇန္န၀ါရီ ၁ ၂၀၀၁ ကေနစၿပီး စကၠန္႔ေတြကို ေရတြက္ပါတယ္။

UNIX ကြန္ျပဴတာေတြမွာ 32 bits ကိန္းနဲ႔ ၁၉၇၀ ကေန စၿပီး စကၠန္႕ အေရအတြက္ေတြ သိမ္းထားတဲ့ အတြက္ ၂၀၃၈ ဇန္န၀ါရီလ ၁၈ ရက္ေန႔အထိပဲ အႀကီးဆံုး သိမ္းလို႔ ရပါတယ္။ အဲဒီက်ရင္ Y2K လိုမ်ိဳး ေနာက္ထပ္ ျပႆနာ ႀကံဳႏိုင္ပါေသးတယ္။

စကားခ်ပ္။ ။ Programming မွာ အခ်ိန္ ရက္စြဲေတြ အေၾကာင္း ေျပာမယ္ဆိုရင္ ေျပာမဆံုးေပါင္ ေတာသံုးေတာင္ ပါပဲ။ Time Zone ေတြ Format ေတြ၊ စံေတြ စနစ္ေတြ ေဒသေတြ စတာေတြကို ထည့္သြင္း စဥ္းစားရပါမည္။ Program တစ္ပုဒ္မွာ အခ်ိန္တြက္တာ သိမ္းရတာ ပါရင္ အလြန္ ဂ႐ုထားရင္ေတာင္ ထည့္သြင္း မစဥ္းစားမိတာေတြ ပါလို႔ ေနာက္ၾကာမွာ မွားေနေၾကာင္း သိရႏိုင္ပါတယ္။ ဥပမာ ရာသီေျပာင္းၿပီးမွ Day light saving ေၾကာင့္တို႔၊ ဒီ Program ကို တျခား ေဒသ မွာ သံုးလို႔ မရတာတို႔၊ ခုႏွစ္ကို ေနာက္ဆံုး ႏွစ္လံုးပဲ သိမ္းလို႔ (၂၀၀၀ အတြက္) 00 က (၁၉၉၈ အတြက္) 98 ထက္ ငယ္ေနတာမ်ိဳးေတြ၊ System (Server) က Time Zone တစ္ေနရာမွာ User က Time Zone တစ္ေနရာမွာ ျဖစ္ေနတာတို႔ စသည္ စသည္ ျပႆနာမ်ိဳးစံု ႀကံဳရႏိုင္ပါတယ္။ အဲဒါေၾကာင့္ စနစ္တစ္ခုအတြက္ Program ေရးတဲ့ အခါ အခ်ိန္ ရက္စြဲေတြ ပါလာၿပီဆို ေပါ့ေပါ့တန္တန္ မလုပ္မိလိုက္ဖို႔ အေရးႀကီးပါတယ္။

10 comments:

Anonymous - 9/7/08, 8:29 AM

GPS epoch and UNIX epoch are different.

Andy Myint - 9/8/08, 9:41 PM
Thanks for adding on, Reader.. :)
Anonymous - 9/14/08, 10:17 PM

ဒါဆို Datetime ကို ဘယ္လိုသိမ္းသင့္လဲဗ်.....
.Net မွာ Datetime format နဲ့ပဲသိမ္းသင့္တာလား.....

Andy Myint - 9/15/08, 5:12 PM
ကၽြန္ေတာ္တို႔ကေတာ့ Standard အေနနဲ႔ UTC နဲ႔ သိမ္းၿပီး Presentation Layer မွာ Time Zone ျပန္ေျပာင္းပါတယ္။ Database ထဲမွာေတာ့ DB က Support လုပ္တဲ့ Date Time နဲ႔ပဲ သိမ္းပါတယ္။ System တစ္ခုနဲ႔ တစ္ခု Data Exchange လုပ္တဲ့ အခ်ိန္မွာေတာ့ Text အေနနဲ႔ လုပ္ပါတယ္။
Anonymous - 9/17/08, 9:41 PM

ဒီလိုဗ်။
အဲ့ဒီ အပ္ေပါ့ခ္ DateTime ကို Sql Query or Store Procedure ထဲမွာ DateTime ဘယ္လိုျပန္ေျပာင္းလို႔ရမလဲဆိုတာသိခ်င္တာပါ။
ခုဟာက အဲ့ဒါကို မသိလို႔ Application ထဲကေန MinValue.Ticks, MaxValue.Ticks နဲ႔ေျပာင္းေနရတယ္။
"128575872000000000" ဒီလိုကို "11/06/2008 00:00:00" ေဟာဒီလိုျဖစ္ေအာင္ Database level ကေနပဲ ဘယ္လိုေျပာင္းရမယ္ဆို သိရင္ေျပာျပပါခင္ဗ်ာ။
Microsoft platform ပါ။

Anonymous - 9/17/08, 9:56 PM

က်န္သြားလို႔ အကို။
အေပၚက တစ္ေယာက္ေမးထားသလိုပဲ .NET မွာဆို datetime format နဲ႔ပဲသိမ္းသင့္တာလား။
timestamp လိုဟာမ်ိဳးနဲ႔ သိမ္းတာလား။ ေျပာျပပါဦး အကို အဲ့ဒီ UTC နဲ႔ သိမ္းတယ္ဆိုတဲ့အေၾကာင္းေလး..အက်ယ္တ၀င့္။

Anonymous - 9/18/08, 4:39 PM

Database layer မွာ convert လုပ္ၾကည့္တာ
presentation layer မွာျပတာထက္
တရက္ေနာက္က်ေနတယ္အကို။
ဥပမာ။ 2008-09-02 07:09:55.000 ဒါက SP ထဲမွာ ေျပာင္းလို႔ရတဲ့ value ျဖစ္ၿပီး၊ 2008-09-03 00:00:00 က မူရင္းတန္ဖိုးကို code ထဲကေန FromFileTime နဲ႔ေျပာင္းလို႔ရတဲ့ value ျဖစ္ေနပါတယ္။

ေနာက္လည္း ဒါမ်ိဳးေတြ ေရးေပးပါဦးအကို။

Andy Myint - 9/18/08, 8:51 PM
.Net ေတာ့ ေမ့ကုန္ၿပီ ခင္ဗ်။ Java မွာေတာ့ Hibernate နဲ႕သံုးေတာ့ သူ႔ဘာသူ သိမ္းသြားေပးတာပဲ။

မူရင္း အခ်ိန္ကို UTC ေျပာင္းသိမ္းၿပီး ျပန္ျပေတာ့ မူရင္း အခ်ိန္ ျပန္ေျပာင္းတာလား။
Anonymous - 9/18/08, 11:51 PM

အင္း ဟုတ္တယ္။ ဒါေပမယ့္ အကိုေမးတာ က်ေနာ္သိပ္မရွင္းဘူးဗ်။
အေပၚက က်ေနာ္ေျပာထားတဲ့ value "128575872000000000" က UTC ျဖစ္ဖို႔မ်ားပါတယ္။
ဒင္းေၾကာင့္ second ျပန္ေျပာင္းတာေတာင္ ရြာလည္သြားတယ္။
1Second=1000000000Nano ကိုး။ UTC ကေနျပန္ေျပာင္းမယ္ဆို 1,000,000,000/100 ဗ်ာ။
အဲ့ဒီေတာ့ divide လုပ္ရမယ့္ ဟာက 10,000,000 နဲ႔။ အဲ့ဂလိုဗ်ာ။
ၿပီးမွ Unix base 1970 နဲ႔ ActiveDirectory က base ထားတဲ့ 1601 ကိုျခားနားၿပီး တစ္ႏွစ္မွာ 365.xxx နဲ႔ ေျမွာက္
ၿပီးရင္ 86400(တစ္ေန႔မွာရိွတဲ့ စကၠန္႔ေပါင္းနဲ႔) ေျမွာက္။

အဲ့သဟာဆို epoch time ကိုျပန္ရတယ္။ၿပီးရင္ေျပာင္းလို႔ရၿပီ။
ဒါေပမယ့္ အေပၚက က်ေနာ္ေမးထားသလိုပဲ နည္းနည္းေနာက္က်ေနတယ္။
ဥပမာ။ ဒီေန႔ 18-09-2008 23:59:59 ဆိုရင္ 19-09-2008 00:00:00 လို႔ယူသလိုေပါ့။

မွားရင္ ျပင္ေပးပါအစ္ကိုေရ။
က်ေနာ္လည္း ကိုယ့္ကိုကိုယ္ေက်နပ္ေလာက္ေအာင္ မရွင္းေသးပါဘူး။

Tina Kyi - 2/26/10, 7:31 PM

left(Xn,count numbers)
function to calculate the current time is =((Xn-(4.73*3600))/86400)+25093 ( For SG use only )

Post a Comment

Many thanks for dropping a comment…

Film


Files