وقت سريع لـ Go
f , err := strftime . New ( `.... pattern ...` )
if err := f . Format ( buf , time . Now ()); err != nil {
log . Println ( err . Error ())
}
أهداف هذه المكتبة هي
يأخذ النمط والوقت، ويقوم بتنسيقه. هذه الوظيفة هي وظيفة أداة مساعدة تقوم بإعادة ترجمة النمط في كل مرة يتم فيها استدعاء الوظيفة. إذا كنت تعلم مسبقًا أنك ستقوم بتنسيق نفس النمط عدة مرات، ففكر في استخدام New
لإنشاء كائن Strftime
وإعادة استخدامه.
يأخذ النمط وينشئ كائن Strftime
جديد.
تقوم بإرجاع سلسلة النمط المستخدمة لإنشاء كائن Strftime
هذا
يقوم بتنسيق الوقت وفقًا للنمط المترجم مسبقًا، ويكتب النتيجة إلى io.Writer
المحدد
تنسيق الوقت وفقًا للنمط المترجم مسبقًا، وإرجاع السلسلة الناتجة.
نمط | وصف |
---|---|
%أ | التمثيل الوطني لاسم أيام الأسبوع الكاملة |
أ | التمثيل الوطني لأيام الأسبوع المختصرة |
%ب | التمثيل الوطني لاسم الشهر كاملا |
%ب | التمثيل الوطني لاسم الشهر المختصر |
%ج | (السنة / 100) كرقم عشري؛ الأرقام الفردية يسبقها صفر |
%ج | التمثيل الوطني للوقت والتاريخ |
د٪ | يعادل %m/%d/%y |
د٪ | يوم من الشهر كرقم عشري (01-31) |
%ه | يوم الشهر كرقم عشري (1-31)؛ الأرقام المفردة مسبوقة بفراغ |
%F | يعادل %Y-%m-%d |
%ح | الساعة (نظام 24 ساعة) كرقم عشري (00-23) |
%ح | نفس %ب |
٪أنا | الساعة (12 ساعة) كرقم عشري (01-12) |
%ي | يوم السنة كرقم عشري (001-366) |
%ك | الساعة (نظام 24 ساعة) كرقم عشري (0-23)؛ الأرقام المفردة مسبوقة بفراغ |
%l | الساعة (12 ساعة) كرقم عشري (1-12)؛ الأرقام المفردة مسبوقة بفراغ |
%م | الدقيقة كرقم عشري (00-59) |
%م | الشهر كرقم عشري (01-12) |
%n | سطر جديد |
%p | التمثيل الوطني إما "ante meridiem" (am) أو "post meridiem" (pm) حسب الاقتضاء. |
% ر | يعادل %H:%M |
%r | يعادل %I:%M:%S %p |
%S | الثاني كرقم عشري (00-60) |
%T | يعادل %H:%M:%S |
%t | علامة تبويب |
%U | رقم الأسبوع من السنة (الأحد باعتباره أول يوم في الأسبوع) كرقم عشري (00-53) |
% ش | أيام الأسبوع (الاثنين باعتباره أول يوم في الأسبوع) كرقم عشري (1-7) |
%V | رقم الأسبوع من السنة (الاثنين هو أول يوم في الأسبوع) كرقم عشري (01-53) |
%v | يعادل %e-%b-%Y |
%W | رقم الأسبوع من السنة (الاثنين باعتباره أول يوم في الأسبوع) كرقم عشري (00-53) |
%w | أيام الأسبوع (الأحد باعتباره أول يوم في الأسبوع) كرقم عشري (0-6) |
%X | التمثيل الوطني في ذلك الوقت |
%x | التمثيل الوطني للتاريخ |
%ص | السنة مع القرن كرقم عشري |
%y | السنة بدون قرن كرقم عشري (00-99) |
%Z | اسم المنطقة الزمنية |
%ض | إزاحة المنطقة الزمنية من UTC |
%% | "%" |
تحاول هذه المكتبة بشكل عام أن تكون متوافقة مع POSIX، لكن في بعض الأحيان تحتاج فقط إلى تلك المواصفات الإضافية أو اثنين من المواصفات الإضافية المستخدمة على نطاق واسع نسبيًا ولكن لم يتم تضمينها في مواصفات POSIX.
على سبيل المثال، لا يحدد POSIX كيفية طباعة أجزاء من الثانية، لكن التطبيقات الشائعة تسمح %f
أو %L
بتحقيق ذلك.
بالنسبة لهذه الحالات، يمكن تكوين strftime.Strftime
لاستخدام مجموعة مخصصة من المواصفات:
ss := strftime.NewSpecificationSet()
ss.Set('L', ...) // provide implementation for `%L`
// pass this new specification set to the strftime instance
p, err := strftime.New(`%L`, strftime.WithSpecificationSet(ss))
p.Format(..., time.Now())
يجب أن يطبق التنفيذ واجهة Appender
، وهي
type Appender interface {
Append([]byte, time.Time) []byte
}
بالنسبة للامتدادات شائعة الاستخدام مثل مثال المللي ثانية والطابع الزمني لنظام Unix، فإننا نوفر تطبيقًا افتراضيًا حتى يتمكن المستخدم من القيام بأحد الإجراءات التالية:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%L`,
strftime.WithSpecification('L', strftime.Milliseconds),
)
// (2) Pass an option that knows to use strftime.Milliseconds
p, err := strftime.New(
`%L`,
strftime.WithMilliseconds('L'),
)
وبالمثل بالنسبة للطابع الزمني لنظام Unix:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%s`,
strftime.WithSpecification('s', strftime.UnixSeconds),
)
// (2) Pass an option that knows to use strftime.UnixSeconds
p, err := strftime.New(
`%s`,
strftime.WithUnixSeconds('s'),
)
إذا كانت هناك مواصفات مشتركة مفقودة، فلا تتردد في إرسال تقرير العلاقات العامة (ولكن يرجى التأكد من قدرتك على الدفاع عن مدى شيوعها)
Milliseconds
(الخيار ذو الصلة: WithMilliseconds
);
Microseconds
(الخيار ذو الصلة: WithMicroseconds
);
UnixSeconds
(الخيار ذو الصلة: WithUnixSeconds
).
تم تشغيل المعايير التالية بشكل منفصل لأن بعض المكتبات كانت تستخدم cgo على منصات محددة (لا سيما الإصدار السريع)
// On my OS X 10.14.6, 2.3 GHz Intel Core i5, 16GB memory.
// go version go1.13.4 darwin/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka-4 297471 3905 ns/op 257 B/op 20 allocs/op
BenchmarkJehiah-4 818444 1773 ns/op 256 B/op 17 allocs/op
BenchmarkFastly-4 2330794 550 ns/op 80 B/op 5 allocs/op
BenchmarkLestrrat-4 916365 1458 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString-4 2527428 546 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter-4 537422 2155 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 25.618s
// On a host on Google Cloud Platform, machine-type: f1-micro (vCPU x 1, memory: 0.6GB)
// (Yes, I was being skimpy)
// Linux <snip> 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u1 (2019-09-20) x86_64 GNU/Linux
// go version go1.13.4 linux/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka 254997 4726 ns/op 256 B/op 20 allocs/op
BenchmarkJehiah 659289 1882 ns/op 256 B/op 17 allocs/op
BenchmarkFastly 389150 3044 ns/op 224 B/op 13 allocs/op
BenchmarkLestrrat 699069 1780 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString 2081594 589 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter 825763 1480 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 11.355s
هذه المكتبة أسرع بكثير من المكتبات الأخرى إذا كان بإمكانك إعادة استخدام نمط التنسيق.
فيما يلي القائمة المشروحة من النتائج القياسية. يمكنك أن ترى بوضوح أن (إعادة) استخدام كائن Strftime
وإنتاج سلسلة هو الأسرع. تبدو الكتابة إلى io.Writer
بطيئة بعض الشيء، ولكن نظرًا لأن الشخص الذي ينتج السلسلة يفعل نفس الشيء تقريبًا، فإننا نعتقد أن هذا مجرد عبء الكتابة إلى io.Writer
مسار الاستيراد | نتيجة | ملحوظة |
---|---|---|
github.com/lestrat-go/strftime | 3000000 | استخدام FormatString() (مخزنة مؤقتًا) |
github.com/fastly/go-utils/strftime | 2000000 | نسخة Pure go على OS X |
github.com/lestrat-go/strftime | 1000000 | استخدام Format() (غير مخبأ) |
github.com/jehiah/go-strftime | 1000000 | |
github.com/fastly/go-utils/strftime | 1000000 | نسخة cgo على نظام Linux |
github.com/lestrat-go/strftime | 500000 | استخدام Format() (مخزن مؤقتًا) |
github.com/tebeka/strftime | 300000 |
ومع ذلك، اعتمادًا على النمط الخاص بك، قد تختلف هذه السرعة. إذا وجدت نمطًا معينًا يبدو بطيئًا، فيرجى إرسال التصحيحات أو الاختبارات.
يرجى أيضًا ملاحظة أن هذا المعيار يستخدم فقط المجموعة الفرعية من مواصفات التحويل التي تدعمها جميع المكتبات المقارنة.
الأشياء التي يجب مراعاتها عند إجراء مقارنات الأداء في المستقبل:
%specification
التي يتعامل معها؟