The Time API: JavaScript için daha iyi tarih işleme



  1. The Time API: JavaScript için daha iyi tarih işleme

ECMAScript standardı sürekli olarak geliştirilmekte ve JavaScript sürekli iyileştirilmektedir. Şimdiye kadarki en büyük şantiyelerden biri tarih ve saatle ilgiliydi. Ancak bu, yeni geçici API ile değişir.


JavaScript, tarih ve saat, bu başlı başına bir hikaye ve ne yazık ki sonu pek iyi değil. Ne zaman yeni bir Date nesnesi oluştursam veya daha kötüsü tarih ve saatle uğraşsam, bu kadar kötü bir tarih ve saat uygulamasına sahip bir dilin nasıl bu kadar ileri gittiğini merak ediyorum. Ama dürüst olalım: bu konu söz konusu olduğunda diğer diller bile kendilerini ihtişamla örtmezler. Ama şimdi JavaScript’ten ve çok güzel bir geliştirmeden bahsedelim.

JavaScript, Temporal adlı, tarihler ve saatlerle ilgilenen ve bu arada Java’nın ilk Date API’lerinden birine dayanan eski Date API’sinden çok daha güzel bir arayüze sahip bir dil uzantısı alıyor. Yeni arayüz yalnızca öncekilerin bazı zayıflıklarını ortadan kaldırmakla kalmıyor, aynı zamanda saat ve tarih yönetimini çok daha modern hale getiriyor ve nesnelerin değişmezliği gibi modern kitaplıkların bazı özelliklerini içeriyor. API şu anda bir ECMAScript teklifi olarak 3. Aşamadadır, ancak bu, bir özelliğin standarda dahil edilmeden önce geçmesi gereken toplam dört aşama ile standardizasyon sürecinin sonuna yaklaşmaktadır. Üçüncü aşamada genellikle büyük arayüz değişiklikleri olmaz, bu nedenle geçici API’de bulduğumuz şey, büyük olasılıkla tarayıcı üreticilerinin sonunda JavaScript motorlarına dahil edecekleri şey olacaktır.

Sabırsız olanlar ve Temporal API’yi hemen şimdi denemek isteyenler için, arayüzü mevcut tarayıcılarda kopyalayan bir çoklu dolgu var. Offer-temporal adlı npm paketi onu içerir ve komutla sağlanır npm install proposal-temporal Kurulmuş. Yerel JavaScript dilinin tüm özellikleri gibi geçici arayüz de platformdan bağımsızdır. Bu, tarayıcıda hem istemci tarafında hem de Node.js’de sunucu tarafında kullanılabileceği anlamına gelir. Aynısı polyfill için de geçerli, ayrıca tüm büyük modüler sistemlerle uyumludur, bu nedenle tüm ortamlarda test edilebilir.

Hızlı Başlangıç: Randevumu nasıl alabilirim?


JavaScript uygulamalarında yaygın olarak karşılaşılan birkaç kullanım durumu vardır ve önce bunlara bakacağız. Şimdiki zamanla başlayalım. time nesnesi bunu bu amaç için sağlar now-ile itiraz et plainDateTime-ISO yöntemi. Özellikle sistemler arası değiş tokuş için, geliştiriciler yalnızca bir tarih dizisiyle değil, aynı zamanda UNIX zaman damgalarıyla, yani 01/01/1970 00:00’dan bu yana geçen saniyelerle de çalışır. Bu bunun için sunar now– nesne yöntemi instantkimin dönüş değeri epochSecondssırayla UNIX zaman damgasını içeren özellik. Yeni zaman arabirimiyle hızlı başlangıçtaki son görev, zamanda rastgele bir nokta oluşturmaktır. Hakkında PlainDateTime.fromelde edilen yöntem. From yöntemi, hem bir yapılandırma nesnesi hem de istenen tarihi belirten bir dize alır. Aşağıdaki liste farklı senaryoları göstermektedir.

import { Temporal } from "proposal-temporal";
const currentTime = Temporal.now.plainDateTimeISO();
console.log(currentTime.toString()); // Ausgabe:
2021-06-03T08:22:18.381338378

const timeStamp = Temporal.now.instant().epochSeconds;

console.log(timeStamp); // Ausgabe: 1622701338
const christmas = Temporal.PlainDateTime.from({
day: 24,
month: 12,
year: 2021,
hour: 20,
minute: 15,
second: 32
});
console.log(christmas.toString()); // Ausgabe: 2021-12-24T20:15:32
Geçici API’nin farklı sınıfları



Date API’den yeni saat arayüzüne geçerken, mevcut uygulamaların iki arayüz arasında tarih ve saat nesnelerini dönüştürmesi gerekecektir. Liste 2, böyle bir dönüşümün nasıl çalışabileceğini gösterir.

import { Temporal } from 'proposal-temporal';
const date = new Date('2020-12-24T20:15:32');
const temporal = new Temporal.ZonedDateTime(
BigInt(date.getTime() * 10 ** 6),
'Europe/Berlin');
console.log(temporal.toString());
//2020-12-24T20:15:32+01:00[Europe/Berlin]

const temporal2 = Temporal.ZonedDateTime.from({
year: 2020,
month: 12,
day: 24,
hour: 20,
minute: 15,
second: 32,
timeZone: 'Europe/Berlin'
});
const date2 = new Date(temporal2.epochMilliseconds);
console.log(date2.toLocaleString()); // Ausgabe: 24/12/2020, 20:15:32


Bu kod örneği, JavaScript Tarih API’sinin temel bir sorununu çok iyi göstermektedir: Date-Bir saat diliminden bağımsız bir nesne oluşturun. O Date-Nesne ortamın yerel saat diliminde, benim durumumda Orta Avrupa Saati. Bu kavramın zamansal karşılığı tipteki nesnelerdir. ZonedDateTime. Ancak bazı durumlarda, bir tarih nesnesindeki saat dilimi bilgilerine hiç gerek yoktur. Zaman arabirimi, tarih ve saatin bir kombinasyonunu temsil edecek birkaç nesneye sahip olarak bu sorunu çözer. Zaman önerisinin aşağıdaki şekli bu gerçeği grafiksel olarak özetlemektedir.




Geçici API sınıfları



Geçici API sınıfları


(Resim: https://tc39.es/proposal-temporal/docs/object-model.svg)



En eksiksiz arayüz sınıfı ZonedDateTime, saat ve saat dilimi bilgilerini içerir. Aksine, onun gibi basit tipler PlainDateTime veya PlainTime saat dilimi bilgisi yoktur ve yalnızca genel bir zaman noktasını temsil eder.Anında Arama dışındaki tüm türler ayrıca belirli bir takvim üzerinde çalışır. Varsayılan olarak Temporal, ISO 8601’de standardize edilmiş Gregoryen takvimini kullanır. Burada kullanılabilecek diğer takvim örnekleri Budist, Fars veya Japon takvimleridir.

tarihlerle hesaplama


Temporal API’nin önceki uygulamaya göre büyük bir avantajı, tarih değerleri ile hesaplama yapabilmesi ve zaman dilimlerini işleyebilmesidir. Bunun temeli, Durationsınıf veya bu sınıf tarafından belirtilen yapıya uyan nesneler. Tarih değerleri ile hesaplama yaparken, zaman arayüzünün bir başka özelliği devreye giriyor: arayüz, tarih değerleri ile çalışıyor. immutable nesneler, örneğin bir ekleme sırasında ilk nesneyi doğrudan değiştirmez, ancak yeni bir nesne döndürür. Aşağıdaki örnek, bunun kodda nasıl çalıştığını gösterir:

import { Temporal } from 'proposal-temporal';
const now = Temporal.now.plainDateTimeISO();
console.log(now.toString()); // Ausgabe: 2021-06-03T19:26:42.949202945
const future = now.add({days: 30});
console.log(future.toString()); // Ausgabe: 2021-07-03T19:26:42.949202945
console.log(now.toString()); // Ausgabe: 2021-06-03T19:26:42.949202945


API’nin tüm basit ve bölgelere ayrılmış geçici sınıfları, add– Ve subtract-Yöntemler. Adından da anlaşılacağı gibi, bunlar belirli bir zamanda zaman dilimleri eklemenize veya çıkarmanıza izin verir. Her iki yöntem de ay, gün veya saat gibi kaç zaman biriminin çıkarılması veya eklenmesi gerektiğini belirten basit JavaScript nesneleri alır. alternatif olarak Duration-Nesne kullanılır.

için başka bir kullanım Duration-Nesne, iki tarih arasındaki sürenin belirlenmesidir. Örneğin, Noel tatilinin başlangıcı ile bitişi arasında kaç gün olduğunu bilmek istiyorsanız, aşağıdaki kaynak kodunu kullanabilirsiniz.

import { Temporal } from 'proposal-temporal';
const start = Temporal.PlainDate.from({
day: 24,
month: 12,
year: 2021
});

const end = Temporal.PlainDate.from({
day: 8,
month: 1,
year: 2022
});

const diff = start.until(end);
const diff2 = end.since(start);
console.log(diff.toString()); // Ausgabe: P15D
console.log(diff2.toString()); // Ausgabe: P15D


Hem başlangıç hem de bitiş noktaları bir sembolle temsil edilir. PlainDate-Nesne temsil eder, çünkü bu durumda ne saat dilimi ne de saat gerekli değildir. Burada kullanılandan farklı untilyöntemi ile kullanılabilir sinceyöntemin aynı zamanda baştan sona zamanı ölçen bir karşılığı da vardır. Sonuç her iki şekilde de Duration– 15 günü kapsayan ürün. Bu nesne daha sonra örneğin toplama veya çıkarma yapmak için diğer geçici nesnelerle kombinasyon halinde yeniden kullanılabilir. Çıktının formatı, P15D, ilk bakışta biraz garip gelebilir, ancak net bir format izliyor. Karakter dizisi P karakteriyle başlar, ardından yıllar, aylar, haftalar ve günler gelir. Böylece tarih ve saat, T karakteri ve ardından saat, dakika ve saniye ile ayrılır.

Bu örnekte sadece tarih değerleri değil, saatler de yer aldıysa, roundbir zaman çerçevesini tam günlere yuvarlama yöntemi. Yöntem, bir yapılandırma nesnesini, ana özelliklerini kabul eder. largestUnit, smallestUnit Ve roundingMode Ben. İlk ikisi, yuvarlamak istediğiniz en küçük veya en büyük birimi belirtir. İle roundingModeÖzellik, geliştiricilerin yuvarlamanın nasıl gerçekleştirileceğini belirlemesine olanak tanır. Örneğin, aşağıdaki listedeki kod tam günleri aşağı doğru yuvarlar:

import { Temporal } from 'proposal-temporal';
const start = Temporal.PlainDateTime.from({
day: 24,
month: 12,
year: 2021,
hour: 7,
minute: 30
});

const end = Temporal.PlainDateTime.from({
day: 8,
month: 1,
year: 2022,
hour: 20,
minute: 15
});

console.log(start.until(end).toString()); // Ausgabe: P15DT12H45M
const diff = start.until(end).round({
smallestUnit: 'day',
roundingMode: 'floor'
});
console.log(diff.toString()); // Ausgabe: P15D


Sonucu roundyöntem aktif Duration-Uygulamanın kullanmaya devam edebileceğine itiraz edin. Ayrıca bu durumda değişmezlik ilkesi korunur.

Çözüm


Geçici API ile TC39, dosyanın Date– JavaScript işlevselliğinin bazı zayıflıkları vardır ve modern uygulamaları uygulamak için en iyi seçim değildir. Zamanla, tarihleri ve saatleri yönetmek için çok sayıda kitaplık oluşturulmuştur. Temporal Proposal, bu kitaplıklar tarafından takip edilen fikirlerin çoğunu alır ve bunları temel JavaScript diline entegre eder. Bunun avantajı, geçici API standarda dahil edildiğinde, bu özelliklerin tarayıcı tarafından doğal olarak desteklenmesidir. Bu, kitaplıklardan ek yük olmadığı ve doğrudan tarayıcıda uygulandığı için özelliğin potansiyel olarak daha performanslı olduğu anlamına gelir. Bu arayüz, JavaScript’in nasıl sürekli geliştiğinin ve geliştiricilerin ihtiyaçlarına cevap verdiğinin harika bir örneğidir.

Gittiler



()



ana sayfaya
 
Üst