JavaScript Temporal APIã䜿çšããŠã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãå®è£ ããæ¹æ³ãåŠã³ãã«ã¹ã¿ã å®è£ ã§ã¿ã€ã ãŸãŒã³ããŒã¿ãæ±ãå©ç¹ãæ¢ããŸãã
JavaScript Temporal TimeZoneããŒã¿ããŒã¹ïŒã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£
JavaScriptã®Temporal APIã¯ãJavaScriptã§ã®æ¥ä»ãšæå»ã®æ±ãã«çŸä»£çãªã¢ãããŒããæäŸããåŸæ¥ã®Dateãªããžã§ã¯ãã®å€ãã®å¶éã«å¯ŸåŠããŸããæ¥ä»ãšæå»ãæ±ãäžã§éèŠãªåŽé¢ã¯ãã¿ã€ã ãŸãŒã³ç®¡çã§ããTemporalã¯IANAïŒInternet Assigned Numbers AuthorityïŒã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ã掻çšããŠããŸãããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£
ãå¿
èŠã«ãªãã·ããªãªãååšããŸãããã®èšäºã§ã¯ãJavaScript Temporal APIã䜿çšããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³å®è£
ã®è€éããæãäžããç¬èªã®ã¿ã€ã ãŸãŒã³ããžãã¯ãäœæããçç±ãææãæ¹æ³ã«çŠç¹ãåœãŠãŸãã
IANAã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ãšãã®éçã«ã€ããŠ
IANAã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ïŒtzdataãŸãã¯ãªã«ãœã³ããŒã¿ããŒã¹ãšãåŒã°ããïŒã¯ãäžçäžã®ããŸããŸãªå°åã®éå»ããã³å°æ¥ã®ç§»è¡ãå«ããã¿ã€ã ãŸãŒã³æ
å ±ã®å
æ¬çãªã³ã¬ã¯ã·ã§ã³ã§ãããã®ããŒã¿ããŒã¹ã¯ãTemporalã§äœ¿çšããããã®ãå«ããã»ãšãã©ã®ã¿ã€ã ãŸãŒã³å®è£
ã®åºç€ãšãªã£ãŠããŸããAmerica/Los_AngelesãEurope/Londonã®ãããªIANAèå¥åã䜿çšããããšã§ãéçºè
ã¯ç°ãªãå Žæã®æå»ãæ£ç¢ºã«è¡šçŸãã倿ããããšãã§ããŸããããããIANAããŒã¿ããŒã¹ã¯äžèœãªè§£æ±ºçã§ã¯ãããŸããã
以äžã¯ãã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ãå¿ èŠãšããå¯èœæ§ã®ããããã€ãã®å¶éã§ãïŒ
- ç¬èªã®ã¿ã€ã ãŸãŒã³ã«ãŒã«ïŒ äžéšã®çµç¹ã管èœåºåã§ã¯ãå ¬ã«å©çšã§ããªãããŸãã¯ãŸã IANAããŒã¿ããŒã¹ã«çµã¿èŸŒãŸããŠããªãã¿ã€ã ãŸãŒã³ã«ãŒã«ã䜿çšããŠããå ŽåããããŸããããã¯ãç¹å®ã®éæšæºçãªã¿ã€ã ãŸãŒã³å®çŸ©ãæã€å éšã·ã¹ãã ãéèæ©é¢ããŸãã¯æ¿åºæ©é¢ã§çºçããå¯èœæ§ããããŸãã
- ãã现ããªå¶åŸ¡ïŒ IANAããŒã¿ããŒã¹ã¯åºç¯ãªå°åãã«ããŒããŠããŸããæšæºçãªIANAå°åãè¶ ããç¹å®ã®ç¹æ§ãå¢çãæã€ã¿ã€ã ãŸãŒã³ãå®çŸ©ããå¿ èŠããããããããŸãããããŸããŸãªã¿ã€ã ãŸãŒã³ã«ãªãã£ã¹ãæã€å€åœç±äŒæ¥ãæ³åããŠã¿ãŠãã ããã圌ãã¯ç¬èªã®ã«ãŒã«ã»ãããæã€å éšçãªãäŒæ¥ãã¿ã€ã ãŸãŒã³ãå®çŸ©ãããããããŸããã
- åçŽåããã衚çŸïŒ ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãIANAããŒã¿ããŒã¹ã®è€éãã¯éå°ãªå ŽåããããŸããéãããã¿ã€ã ãŸãŒã³ã»ããã®ã¿ããµããŒãããå¿ èŠãããå Žåããããã©ãŒãã³ã¹äžã®çç±ã§åçŽåããã衚çŸãå¿ èŠãªå Žåãã«ã¹ã¿ã å®è£ ã®æ¹ãå¹ççãããããŸããããªãœãŒã¹ãéãããŠããçµã¿èŸŒã¿ããã€ã¹ãèããŠã¿ãŠãã ãããããã§ã¯ãçž®å°ãããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³å®è£ ãããçŸå®çã§ãã
- ãã¹ããšã·ãã¥ã¬ãŒã·ã§ã³ïŒ æéã«ææãªã¢ããªã±ãŒã·ã§ã³ããã¹ãããéã«ãæšæºã®IANAããŒã¿ããŒã¹ã§ã¯åçŸãé£ããç¹å®ã®ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãã·ããªãªãã·ãã¥ã¬ãŒããããå ŽåããããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã䜿çšãããšããã¹ãç®çã§å¶åŸ¡ãããç°å¢ãäœæã§ããŸããäŸãã°ãæ£ç¢ºãªåžå Žã®ééæéãã·ãã¥ã¬ãŒãããããã«ãããŸããŸãªæš¡æ¬ã¿ã€ã ãŸãŒã³ã§éèååŒã·ã¹ãã ããã¹ããããªã©ã§ãã
- IANAãè¶ ããæŽå²çæ£ç¢ºæ§ïŒ IANAã¯å æ¬çã§ãããéåžžã«ç¹å®ã®æŽå²çãªç®çã®ããã«ãæŽå²çããŒã¿ã«åºã¥ããŠIANAæ å ±ã眮ãæããããæ¹è¯ãããããã¿ã€ã ãŸãŒã³ã«ãŒã«ãäœæããå¿ èŠããããããããŸããã
Temporal.TimeZoneã€ã³ã¿ãŒãã§ãŒã¹
Temporal.TimeZoneã€ã³ã¿ãŒãã§ãŒã¹ã¯ãTemporal APIã§ã¿ã€ã ãŸãŒã³ã衚çŸããããã®ã³ã¢ã³ã³ããŒãã³ãã§ããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæããã«ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããå¿
èŠããããŸãããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ã以äžã®ã¡ãœãããå®è£
ããå¿
èŠããããŸãïŒ
getOffsetStringFor(instant: Temporal.Instant): stringïŒæå®ãããTemporal.Instantã®ãªãã»ããæååïŒäŸïŒ+01:00ïŒãè¿ããŸãããã®ã¡ãœããã¯ãç¹å®ã®æç¹ã§ã®UTCããã®ãªãã»ãããæ±ºå®ããããã«éèŠã§ããgetOffsetNanosecondsFor(instant: Temporal.Instant): numberïŒæå®ãããTemporal.Instantã®ãªãã»ãããããç§ã§è¿ããŸããããã¯getOffsetStringForã®ããæ£ç¢ºãªããŒãžã§ã³ã§ããgetNextTransition(startingPoint: Temporal.Instant): Temporal.Instant | nullïŒæå®ãããTemporal.Instantã®åŸã®æ¬¡ã®ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãè¿ããŸãããã以äžç§»è¡ããªãå Žåã¯nullãè¿ããŸããgetPreviousTransition(startingPoint: Temporal.Instant): Temporal.Instant | nullïŒæå®ãããTemporal.Instantã®åã®åã®ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãè¿ããŸãããã以åã«ç§»è¡ããªãå Žåã¯nullãè¿ããŸããtoString(): stringïŒã¿ã€ã ãŸãŒã³ã®æåå衚çŸãè¿ããŸãã
ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£
åºå®ãªãã»ãããæã€åçŽãªã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæããŠã¿ãŸãããããã®äŸã¯ãã«ã¹ã¿ã Temporal.TimeZoneå®è£
ã®åºæ¬çãªæ§é ã瀺ããŠããŸãã
äŸïŒåºå®ãªãã»ããã®ã¿ã€ã ãŸãŒã³
UTCãã+05:30ã®åºå®ãªãã»ãããæã€ã¿ã€ã ãŸãŒã³ãèããŠã¿ãŸããããããã¯ã€ã³ãã§äžè¬çã§ãïŒãã ããIANAã¯ã€ã³ãçšã®æšæºã¿ã€ã ãŸãŒã³ãæäŸããŠããŸãïŒããã®äŸã§ã¯ã倿éïŒDSTïŒã®ç§»è¡ãèæ ®ããã«ããã®ãªãã»ããã衚ãã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæããŸãã
class FixedOffsetTimeZone {
constructor(private offset: string) {
if (!/^([+-])(\d{2}):(\d{2})$/.test(offset)) {
throw new RangeError('Invalid offset format. Must be +HH:MM or -HH:MM');
}
}
getOffsetStringFor(instant: Temporal.Instant): string {
return this.offset;
}
getOffsetNanosecondsFor(instant: Temporal.Instant): number {
const [sign, hours, minutes] = this.offset.match(/^([+-])(\d{2}):(\d{2})$/)!.slice(1);
const totalMinutes = parseInt(hours, 10) * 60 + parseInt(minutes, 10);
const nanoseconds = totalMinutes * 60 * 1_000_000_000;
return sign === '+' ? nanoseconds : -nanoseconds;
}
getNextTransition(startingPoint: Temporal.Instant): Temporal.Instant | null {
return null; // åºå®ãªãã»ããã®ã¿ã€ã ãŸãŒã³ã«ã¯é·ç§»ã¯ãããŸãã
}
getPreviousTransition(startingPoint: Temporal.Instant): Temporal.Instant | null {
return null; // åºå®ãªãã»ããã®ã¿ã€ã ãŸãŒã³ã«ã¯é·ç§»ã¯ãããŸãã
}
toString(): string {
return `FixedOffsetTimeZone(${this.offset})`;
}
}
const customTimeZone = new FixedOffsetTimeZone('+05:30');
const now = Temporal.Now.instant();
const zonedDateTime = now.toZonedDateTimeISO(customTimeZone);
console.log(zonedDateTime.toString());
説æïŒ
FixedOffsetTimeZoneã¯ã©ã¹ã¯ãã³ã³ã¹ãã©ã¯ã¿ã§ãªãã»ããæååïŒäŸïŒ+05:30ïŒãåãåããŸããgetOffsetStringForã¡ãœããã¯ãåã«åºå®ãªãã»ããæååãè¿ããŸããgetOffsetNanosecondsForã¡ãœããã¯ããªãã»ããæååã«åºã¥ããŠããç§åäœã®ãªãã»ãããèšç®ããŸããgetNextTransitionããã³getPreviousTransitionã¡ãœããã¯ããã®ã¿ã€ã ãŸãŒã³ã«ã¯ç§»è¡ããªãããnullãè¿ããŸããtoStringã¡ãœããã¯ãã¿ã€ã ãŸãŒã³ã®æåå衚çŸãæäŸããŸãã
äœ¿çšæ³ïŒ
äžèšã®ã³ãŒãã¯ã+05:30ã®ãªãã»ãããæã€FixedOffsetTimeZoneã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããæ¬¡ã«ãçŸåšã®ã€ã³ã¹ã¿ã³ããååŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã䜿çšããŠZonedDateTimeã«å€æããŸããZonedDateTimeãªããžã§ã¯ãã®toString()ã¡ãœããã¯ãæå®ãããã¿ã€ã ãŸãŒã³ã®æ¥ä»ãšæå»ãåºåããŸãã
äŸïŒåäžã®ç§»è¡ãæã€ã¿ã€ã ãŸãŒã³
åäžã®ç§»è¡ãå«ããããè€éãªã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãå®è£ ããŠã¿ãŸããããç¹å®ã®DSTã«ãŒã«ãæã€æ¶ç©ºã®ã¿ã€ã ãŸãŒã³ãæ³å®ããŸãã
class SingleTransitionTimeZone {
private readonly transitionInstant: Temporal.Instant;
private readonly standardOffset: string;
private readonly dstOffset: string;
constructor(
transitionEpochNanoseconds: bigint,
standardOffset: string,
dstOffset: string
) {
this.transitionInstant = Temporal.Instant.fromEpochNanoseconds(transitionEpochNanoseconds);
this.standardOffset = standardOffset;
this.dstOffset = dstOffset;
}
getOffsetStringFor(instant: Temporal.Instant): string {
return instant < this.transitionInstant ? this.standardOffset : this.dstOffset;
}
getOffsetNanosecondsFor(instant: Temporal.Instant): number {
const offsetString = this.getOffsetStringFor(instant);
const [sign, hours, minutes] = offsetString.match(/^([+-])(\d{2}):(\d{2})$/)!.slice(1);
const totalMinutes = parseInt(hours, 10) * 60 + parseInt(minutes, 10);
const nanoseconds = totalMinutes * 60 * 1_000_000_000;
return sign === '+' ? nanoseconds : -nanoseconds;
}
getNextTransition(startingPoint: Temporal.Instant): Temporal.Instant | null {
return startingPoint < this.transitionInstant ? this.transitionInstant : null;
}
getPreviousTransition(startingPoint: Temporal.Instant): Temporal.Instant | null {
return startingPoint >= this.transitionInstant ? this.transitionInstant : null;
}
toString(): string {
return `SingleTransitionTimeZone(transition=${this.transitionInstant.toString()}, standard=${this.standardOffset}, dst=${this.dstOffset})`;
}
}
// 䜿çšäŸïŒå®éã®ãšããã¯ããç§ã¿ã€ã ã¹ã¿ã³ãã«çœ®ãæããŠãã ããïŒ
const transitionEpochNanoseconds = BigInt(1672531200000000000); // January 1, 2023, 00:00:00 UTC
const standardOffset = '+01:00';
const dstOffset = '+02:00';
const customTimeZoneWithTransition = new SingleTransitionTimeZone(
transitionEpochNanoseconds,
standardOffset,
dstOffset
);
const now = Temporal.Now.instant();
const zonedDateTimeBefore = now.toZonedDateTimeISO(customTimeZoneWithTransition);
const zonedDateTimeAfter = Temporal.Instant.fromEpochNanoseconds(transitionEpochNanoseconds + BigInt(1000)).toZonedDateTimeISO(customTimeZoneWithTransition);
console.log("Before Transition:", zonedDateTimeBefore.toString());
console.log("After Transition:", zonedDateTimeAfter.toString());
説æïŒ
SingleTransitionTimeZoneã¯ã©ã¹ã¯ãæšæºæãã倿éãžã®åäžã®ç§»è¡ãæã€ã¿ã€ã ãŸãŒã³ãå®çŸ©ããŸãã- ã³ã³ã¹ãã©ã¯ã¿ã¯ãç§»è¡ã®
Temporal.Instantãæšæºãªãã»ãããããã³DSTãªãã»ãããåŒæ°ãšããŠåãåããŸãã getOffsetStringForã¡ãœããã¯ãæå®ãããTemporal.Instantãç§»è¡ã€ã³ã¹ã¿ã³ãã®åãåŸãã«åºã¥ããŠãé©åãªãªãã»ãããè¿ããŸããgetNextTransitionããã³getPreviousTransitionã¡ãœããã¯ãé©çšå¯èœãªå Žåã¯ç§»è¡ã€ã³ã¹ã¿ã³ããè¿ãããã以å€ã®å Žåã¯nullãè¿ããŸãã
éèŠãªèæ ®äºé ïŒ
- ç§»è¡ããŒã¿ïŒ å®éã®ã·ããªãªã§ã¯ãæ£ç¢ºãªç§»è¡ããŒã¿ãååŸããããšãéèŠã§ãããã®ããŒã¿ã¯ãç¬èªã®æ å ±æºãæŽå²çèšé²ããŸãã¯ãã®ä»ã®å€éšããŒã¿ãããã€ãããååŸãããå ŽåããããŸãã
- ãããç§ïŒ Temporal APIã¯ãããç§ãç¹å®ã®æ¹æ³ã§åŠçããŸããã¢ããªã±ãŒã·ã§ã³ããã®ãããªç²ŸåºŠãå¿
èŠãšããå Žåãã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£
ããããç§ãæ£ããèæ
®ããŠããããšã確èªããŠãã ããããããç§ãã¹ã ãŒãºã«ç¡èŠããŠçŸåšã®æå»ãã€ã³ã¹ã¿ã³ããšããŠè¿ã
Temporal.Now.instant()ã®äœ¿çšãæ€èšããŠãã ããã - ããã©ãŒãã³ã¹ïŒ ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ã¯ãç¹ã«è€éãªèšç®ã䌎ãå Žåãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããå Žåã¯ãå¹ççã«åäœããããã«ã³ãŒããæé©åããŠãã ãããäŸãã°ãåé·ãªèšç®ãé¿ããããã«ãªãã»ããèšç®ãã¡ã¢åããŸãã
- ãã¹ãïŒ ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ã培åºçã«ãã¹ãããŠãããŸããŸãªã·ããªãªã§æ£ããåäœããããšã確èªããŠãã ãããããã«ã¯ãç§»è¡ããšããžã±ãŒã¹ãããã³ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåãšã®çžäºäœçšã®ãã¹ããå«ãŸããŸãã
- IANAã®æŽæ°ïŒ ã«ã¹ã¿ã å®è£ ã«åœ±é¿ãäžããå¯èœæ§ã®ããæŽæ°ã«ã€ããŠãIANAã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ã宿çã«ç¢ºèªããŠãã ãããIANAããŒã¿ãã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å¿ èŠæ§ã眮ãæããå¯èœæ§ããããŸãã
ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®çšçãªãŠãŒã¹ã±ãŒã¹
ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯åžžã«å¿ èŠãšããããã§ã¯ãããŸããããç¬èªã®å©ç¹ãæäŸããã·ããªãªããããŸãã以äžã«ããã€ãã®å®çšçãªãŠãŒã¹ã±ãŒã¹ã瀺ããŸãïŒ
- éèååŒãã©ãããã©ãŒã ïŒ éèååŒãã©ãããã©ãŒã ã¯ãç¹ã«åœéåžå Žãæ±ãéã«ãé«ã粟床ã§ã¿ã€ã ãŸãŒã³ããŒã¿ãåŠçããå¿ èŠããããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ãæšæºã®IANAããŒã¿ããŒã¹ã§ã¯ã«ããŒãããŠããªãååŒæåºæã®ã¿ã€ã ãŸãŒã³ã«ãŒã«ãååŒã»ãã·ã§ã³æéã衚çŸã§ããŸããäŸãã°ãäžéšã®ååŒæã¯ãååŒæéã«åœ±é¿ãäžãã倿Žããã倿éã«ãŒã«ãç¹å®ã®äŒæ¥ã¹ã±ãžã¥ãŒã«ã§éå¶ãããŠããŸãã
- èªç©ºæ¥çïŒ èªç©ºæ¥çã¯ããã©ã€ãã®ã¹ã±ãžã¥ãŒãªã³ã°ãšéèªã®ããã«æ£ç¢ºãªæé管çã«å€§ããäŸåããŠããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ãç©ºæž¯åºæã®ã¿ã€ã ãŸãŒã³ã衚ãããããã©ã€ãèšç»ã·ã¹ãã ã§ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãåŠçãããããããã«äœ¿çšã§ããŸããäŸãã°ãç¹å®ã®èªç©ºäŒç€Ÿã¯ãè€æ°ã®å°åã«ããã£ãŠå éšã®ãèªç©ºäŒç€Ÿæéãã§éèªããå ŽåããããŸãã
- 黿°éä¿¡ã·ã¹ãã ïŒ é»æ°éä¿¡ã·ã¹ãã ã¯ãé話ã«ãŒãã£ã³ã°ãè«æ±ãããã³ãããã¯ãŒã¯åæã®ããã«ã¿ã€ã ãŸãŒã³ã管çããå¿ èŠããããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ãç¹å®ã®ãããã¯ãŒã¯é åã衚ãããã忣ã·ã¹ãã ã§ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãåŠçãããããããã«äœ¿çšã§ããŸãã
- è£œé æ¥ãšç©æµïŒ è£œé æ¥ãšç©æµã§ã¯ãçç£ã¹ã±ãžã¥ãŒã«ã®è¿œè·¡ããµãã©ã€ãã§ãŒã³ã®ç®¡çãããã³ã°ããŒãã«ãªæ¥åã®èª¿æŽã«ãããŠãã¿ã€ã ãŸãŒã³ã®æ£ç¢ºæ§ãéèŠã§ããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ãå·¥å Žåºæã®ã¿ã€ã ãŸãŒã³ã衚ããããç©æµç®¡çã·ã¹ãã ã§ã¿ã€ã ãŸãŒã³ã®ç§»è¡ãåŠçãããããããã«äœ¿çšã§ããŸãã
- ã²ãŒã æ¥çïŒ ãªã³ã©ã€ã³ã²ãŒã ã§ã¯ãç°ãªãã¿ã€ã ãŸãŒã³ã«ããã£ãŠç¹å®ã®æéã«çºçããã¹ã±ãžã¥ãŒã«ãããã€ãã³ããããŒãã¡ã³ãããã°ãã°ãããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ãã²ãŒã ã€ãã³ããåæãããããŸããŸãªå Žæã®ãã¬ã€ã€ãŒã«æ£ç¢ºã«æéã衚瀺ããããã«äœ¿çšã§ããŸãã
- çµã¿èŸŒã¿ã·ã¹ãã ïŒ ãªãœãŒã¹ãéãããŠããçµã¿èŸŒã¿ã·ã¹ãã ã¯ãåçŽåãããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³å®è£ ã®æ©æµãåããå¯èœæ§ããããŸãããããã®ã·ã¹ãã ã¯ãã¡ã¢ãªäœ¿çšéãšèšç®ãªãŒããŒããããæå°éã«æããããã«ãçž®å°ãããã¿ã€ã ãŸãŒã³ã»ãããå®çŸ©ããããåºå®ãªãã»ããã®ã¿ã€ã ãŸãŒã³ã䜿çšãããã§ããŸãã
ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³å®è£ ã®ãã¹ããã©ã¯ãã£ã¹
ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãå®è£ ããéã«ã¯ãæ£ç¢ºæ§ãããã©ãŒãã³ã¹ãããã³ä¿å®æ§ã確ä¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- Temporal APIãæ£ãã䜿çšããïŒ
Temporal.InstantãTemporal.ZonedDateTimeãTemporal.TimeZoneãªã©ãTemporal APIãšãã®æŠå¿µãçè§£ããŠããããšã確èªããŠãã ããããããã®æŠå¿µã誀解ãããšãäžæ£ç¢ºãªã¿ã€ã ãŸãŒã³èšç®ã«ã€ãªããå¯èœæ§ããããŸãã - å ¥åããŒã¿ãæ€èšŒããïŒ ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæããéã«ã¯ããªãã»ããæååãç§»è¡æéãªã©ã®å ¥åããŒã¿ãæ€èšŒããŠãã ãããããã«ããããšã©ãŒãé²ããã¿ã€ã ãŸãŒã³ãæåŸ ã©ããã«åäœããããšã確èªã§ããŸãã
- ããã©ãŒãã³ã¹ãæé©åããïŒ ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ã¯ãç¹ã«è€éãªèšç®ã䌎ãå Žåãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããå¹ççãªã¢ã«ãŽãªãºã ãšããŒã¿æ§é ã䜿çšããŠã³ãŒããæé©åããŠãã ãããåé·ãªèšç®ãé¿ããããã«ãé »ç¹ã«äœ¿çšãããå€ããã£ãã·ã¥ããããšãæ€èšããŠãã ããã
- ãšããžã±ãŒã¹ãåŠçããïŒ ã¿ã€ã ãŸãŒã³ã®ç§»è¡ã¯ãç¹ã«å€æéã§ã¯è€éã«ãªãããšããããŸããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ããç§»è¡äžã«2åçºçããæéãååšããªãæéãªã©ã®ãšããžã±ãŒã¹ãæ£ããåŠçããããšã確èªããŠãã ããã
- æç¢ºãªããã¥ã¡ã³ããæäŸããïŒ ã¿ã€ã ãŸãŒã³ã®ã«ãŒã«ãç§»è¡æéãããã³ç¹å®ã®èæ ®äºé ãå«ããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£ ã培åºçã«ææžåããŠãã ãããããã«ãããä»ã®éçºè ãã³ãŒããçè§£ããç¶æããã®ã«åœ¹ç«ã¡ãŸãã
- IANAã®æŽæ°ãèæ ®ããïŒ ã«ã¹ã¿ã å®è£ ã«åœ±é¿ãäžããå¯èœæ§ã®ããæŽæ°ã«ã€ããŠãIANAã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ãç£èŠããŠãã ãããæ°ããIANAããŒã¿ãã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å¿ èŠæ§ã眮ãæããå¯èœæ§ããããŸãã
- éå°ãªèšèšãé¿ããïŒ æ¬åœã«å¿ èŠãªå Žåã«ã®ã¿ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæããŠãã ãããæšæºã®IANAããŒã¿ããŒã¹ãèŠä»¶ãæºãããŠããå Žåã¯ãã«ã¹ã¿ã å®è£ ãäœæãããããããã䜿çšããæ¹ãäžè¬çã«åªããŠããŸããéå°ãªèšèšã¯ãè€éããšã¡ã³ããã³ã¹ã®ãªãŒããŒããããå¢å ãããå¯èœæ§ããããŸãã
- æå³ã®ããã¿ã€ã ãŸãŒã³èå¥åã䜿çšããïŒ ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã§ãã£ãŠãããã®ç¬èªã®æ©èœã远跡ããããããããã«ãå éšã§çè§£ããããèå¥åãä»ããããšãæ€èšããŠãã ããã
çµè«
JavaScript Temporal APIã¯ãJavaScriptã§æ¥ä»ãšæå»ãåŠçããããã®åŒ·åã§æè»ãªæ¹æ³ãæäŸããŸããIANAã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ã¯è²ŽéãªãªãœãŒã¹ã§ãããç¹å®ã®ã·ããªãªã§ã¯ã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã®å®è£
ãå¿
èŠã«ãªãããšããããŸããTemporal.TimeZoneã€ã³ã¿ãŒãã§ãŒã¹ãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãç¹å®ã®èŠä»¶ãæºãããã¢ããªã±ãŒã·ã§ã³ã§æ£ç¢ºãªã¿ã€ã ãŸãŒã³åŠçãä¿èšŒããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ãäœæã§ããŸããéèãèªç©ºããŸãã¯æ£ç¢ºãªæé管çã«äŸåãããã®ä»ã®æ¥çã§äœæ¥ããŠããå Žåã§ããã«ã¹ã¿ã ã¿ã€ã ãŸãŒã³ã¯ã¿ã€ã ãŸãŒã³ããŒã¿ãæ£ç¢ºãã€å¹ççã«åŠçããããã®è²ŽéãªããŒã«ãšãªãåŸãŸãã