نظر شما در مورد جاوا اسکریپت هرچه باشد ، همه فکر می کنند که کار با خرما خراب است. Date() پیاده سازی شی در سال 1995 مستقیماً از جاوا کپی شد. جاوا دو سال بعد آن را لغو کرد اما برای سازگاری عقب مانده در جاوا اسکریپت باقی ماند.

اینها مشکلاتی است که با آن روبرو هستیم Date():

  • این فقط از UTC و زمان محلی کاربر پشتیبانی می کند
  • از تقویمهای غیر میلادی پشتیبانی نمی شود
  • رفتار صرفه جویی در نور روز قابل پیش بینی نیست
  • تجزیه تاریخ از رشته غیر قابل اعتماد است
  • API بد بو است
  • Date اشیا قابل تغییر هستند: با استفاده از روش ها یک تاریخ تغییر می کند

محبوب ترین گزینه قبلا moment.js کتابخانه تاریخ با این حال ، این بوده است در حالت تعمیر و نگهداری قرار داده شده است و واقعاً نباید از آنها در پروژه های جدید استفاده شود. آنها توصیه می کنند چند گزینه، اما هر یک از اینها مزایا و معایب خاص خود را دارند.

Date() شی را نمی توان از JavaScript حذف کرد ، اما یک چیز جدید است Temporal گزینه در است مرحله 2 در فرآیند تأیید استانداردهای TC39. ویژگی ها و روش های مورد بحث در اینجا ممکن است تغییر کند ، اما API باید مدتی در سال 2021 به مرورگرها و زمان اجرا برسد.

زمان موقتی

Temporal یک سطح جهانی سطح ثابت است (مانند Math)

اهداف اصلی آن عبارتند از:

  • یک رفتار قابل پیش بینی / زمان اجرا
  • API آسان تر برای محاسبات تاریخ و زمان
  • پشتیبانی از تقویم های غیر میلادی
  • پشتیبانی از همه مناطق زمانی ، از جمله حساب صرفه جویی در نور روز
  • تجزیه رشته های ISO-8601 دقیقاً مشخص شده
  • همه اشیا را تغییرناپذیر می کند

API جامع است و ممکن است تغییر کند ، اما شما می توانید در آینده ای نزدیک منتظر ویژگی های اصلی زیر باشید.

تاریخ و زمان فعلی

Temporal.now تاریخ / زمان فعلی را برمی گرداند ، که می تواند به روشهای دیگر برای ارائه اطلاعات اضافی منتقل شود. مثلا:


Temporal.now.instant();
Temporal.now.instant().epochSeconds;
Temporal.now.instant().epochMilliseconds;


Temporal.now.timeZone();



Temporal.now.zonedDateTimeISO();



Temporal.now.zonedDateTimeISO('Europe/London');

ایجاد تاریخ / زمان فوری

Temporal.Instant جسم نشان دهنده یک نقطه واحد از زمان تا نزدیکترین نانو ثانیه است. این را می توان از رشته های قالب بندی شده ISO 8601 یا چند ثانیه ، میلی ثانیه یا میکروثانیه ایجاد کرد:

const
  t1 = Temporal.Instant.from('2021-03-30T01:45:00+01:00[Europe/Berlin]'),
  t2 = Temporal.Instant.from('2021-04-01T02:00+01:00'),
  t3 = Temporal.Instant.fromEpochSeconds(1.0e8),
  t4 = Temporal.Instant.fromEpochMilliseconds(1.0e10),
  t5 = Temporal.Instant.epochNanoseconds(1.0e12);

ایجاد تاریخ / زمان های آگاه از منطقه

Temporal.ZonedDateTime شی object نشان دهنده یک منطقه زمانی و تاریخ / زمان آگاه از تقویم در لحظه وقوع (یا رخ می دهد) در یک منطقه خاص است. انواع سازنده های مختلف را می توان استفاده کرد:

new Temporal.ZonedDateTime(
  1234567890000, 
  Temporal.TimeZone.from('America/Los_Angeles'), 
  Temporal.Calendar.from('iso8601') 
);

Temporal.ZonedDateTime.from('2025-12-07T03:24:30+02:00[Africa/Cairo]');

Temporal.Instant('2022-08-05T20:06:13+05:45').toZonedDateTime('+05:45');

Temporal.ZonedDateTime.from({
  timeZone: 'America/New_York'
  year: 2025,
  month: 1,
  day: 7,
  hour: 9,
  minute: 30,
  second: 1,
  millisecond: 2,
  microsecond: 3,
  nanosecond: 4
});

ایجاد تاریخ و زمانهای ساده

استفاده از لحظات دقیق همیشه ضروری نیست ، بنابراین Temporal API اشیایی را ارائه می دهد که مستقل از مناطق زمانی نیستند. از این موارد می توان برای موارد ساده تر ، مانند جلسه امروز ساعت 14 استفاده کرد.

همه سازندگان مشابه دارند:



new Temporal.PlainDateTime(2021, 5, 4, 13, 14, 15);
Temporal.PlainDateTime.from('2021-05-04T13:14:15');



new Temporal.PlainDate(2021, 5, 4);
Temporal.PlainDate.from('2021-05-04');



new Temporal.PlainTime(13, 14, 15);
Temporal.PlainTime.from('13:14:15');



new Temporal.PlainYearMonth(2021, 4);
Temporal.PlainYearMonth.from('2019-04');



new Temporal.PlainMonthDay(3, 14);
Temporal.PlainMonthDay.from('03-14');

همه Temporal اشیا می توانند مقادیر گسسته مربوط به یک تاریخ / زمان خاص را بازگردانند. به عنوان مثال ، با استفاده از a ZonedDateTime:

const t1 = Temporal.ZonedDateTime.from('2025-12-07T03:24:30+02:00[Africa/Cairo]');

t1.year;        
t1.month;       
t1.day;         
t1.hour;        
t1.minute;      
t1.second;      
t1.millisecond; 
t1.microsecond; 
t1.nanosecond;  

سایر خواص مفید عبارتند از:

  • dayOfWeek (1 برای دوشنبه تا 7 برای یکشنبه)
  • dayOfYear (1 تا 365 یا 366)
  • weekOfYear (1 تا 52 یا بعضی اوقات 53)
  • daysInMonth (28 ، 29 ، 30 یا 31)
  • daysInYear (365 یا 366)
  • inLeapYear (true یا false)

مقایسه و مرتب سازی تاریخ ها

همه Temporal اشیا را می توان با استفاده از a مقایسه کرد compare() تابع ، که یک عدد صحیح را برمی گرداند. به عنوان مثال ، برای مقایسه دو ZonedDateTime اشیاء:





Temporal.ZonedDateTime.compare(t1, t2);

compare() می تواند به عنوان یک آرایه استفاده شود sort() عملکرد برای ترتیب تاریخ / زمانها به ترتیب صعودی (زودتر از آخرین):

const t = [

    '2022-01-01T00:00:00+00:00[Europe/London]',
    '2022-01-01T00:00:00+00:00[Africa/Cairo]',
    '2022-01-01T00:00:00+00:00[America/New_York]'

  ].map( d => Temporal.ZonedDateTime.from(d) )
  .sort( Temporal.ZonedDateTime.compare );

محاسبات تاریخ

روشهای مختلفی برای انجام محاسبات تاریخ در هر شی Temporal ارائه شده است. همه با عبور از یک Temporal جدید از همان نوع باز می گردند Temporal.Duration شی ، که یک دوره را در تعریف می کند years، months، days، hours، و غیره

const t1 = Temporal.ZonedDateTime.from('2022-01-01T00:00:00+00:00[Europe/London]');


t1.add({ hours: 8, minutes: 30 });


t1.subtract({ days: 5 });


t1.round({ smallestUnit: 'month' });

توجه داشته باشید که Plain تاریخ و زمان می تواند بسته بندی شود. به عنوان مثال ، اضافه کردن 24 ساعت به هر زمان PlainTime شیئی را که دارای مقدار یکسانی است ، برمی گرداند.

until() و since() روشها برمی گردند Temporal.Duration شی object توصیف زمان تا یا از تاریخ یا زمان خاص:


t1.until().months;


t1.since().weeks;

سرانجام ، equals() روش می تواند تعیین کند که آیا دو مقدار تاریخ / زمان برابر هستند:

const
  d1 = Temporal.PlainDate.from('2022-01-31');
  d2 = Temporal.PlainDate.from('2021-01-31');

d1.equals(d2); 

قالب بندی تاریخ ها با API Internationalization

JavaScript اگرچه بخشی از Temporal API نیست Intl (Internationalization) API فراهم می کند DateTimeFormat() سازنده ای که می تواند برای قالب بندی اشیا T زمانی یا تاریخی استفاده شود:

const d = new Temporal.PlainDate(2021, 3, 14);


new Intl.DateTimeFormat('en-US').format(d);


new Intl.DateTimeFormat('en-GB').format(d);


new Intl.DateTimeFormat('es-ES', { dateStyle: 'full' }).format(d);

درباره زمان؟

Date() یک ربع قرن این موضوع باعث ناامیدی توسعه دهنده شده است. در حالی که هیچ تضمینی وجود ندارد Temporal به سرعت به یک ویژگی استاندارد تبدیل می شود ، آینده تاریخ های JavaScript کمی روشن تر به نظر می رسد.

می توانید امتحان کنید Temporal امروز ، از طریق پرکن تجربی، اما از آن در تولید استفاده نکنید (هنوز)!

اطلاعات بیشتر: