1
1
mirror of https://github.com/leon-ai/leon.git synced 2024-11-28 12:43:35 +03:00

feat(skill/date_time): time zone

This commit is contained in:
Théo LUDWIG 2023-06-29 23:03:03 +02:00
parent 2478adbaa2
commit cc01bd18b2
No known key found for this signature in database
GPG Key ID: ADFE5A563D718F3B
2 changed files with 85 additions and 0 deletions

View File

@ -48,12 +48,25 @@
"In how many days will it be February 10th?",
"Calculate the number until March 1st"
]
},
"current_date_time_with_time_zone": {
"type": "logic",
"utterance_samples": [
"What is the time in San Francisco?",
"What time is it in Paris?",
"Can you tell me the current time in London?",
"What's the time right now in Tokyo?",
"What is the current date and time in New York City?"
]
}
},
"answers": {
"current_date_time": [
"It is %weekday%, %month% %day%, %year%, and it is %hours%:%minutes%:%seconds%."
],
"current_date_time_with_time_zone": [
"Greetings from %city%, %country%! The local date and time is %weekday%, %month% %day%, %year%, and it is %hours%:%minutes%:%seconds%."
],
"current_date": ["It is %weekday%, %month% %day%, %year%."],
"current_time": ["It is %hours%:%minutes%:%seconds%."],
"current_week_number": ["It is the %week_number% week of the year."],
@ -62,6 +75,9 @@
],
"days_countdown_error": [
"I'm sorry, I didn't understand the date you said."
],
"city_not_found": [
"I'm sorry, I couldn't find the city you said. Please try again."
]
}
}

View File

@ -0,0 +1,69 @@
import type { ActionFunction, SpacyLocationCityEntity } from '@sdk/types'
import { leon } from '@sdk/leon'
import { zeroPad } from '../lib/zeroPad'
/**
* Determine if the given date is in Daylight Saving Time (DST).
* @example isDaylightSavingTime(new Date(2020, 0, 1)) // false
* @example isDaylightSavingTime(new Date(2020, 7, 1)) // true
*/
function isDaylightSavingTime(date: Date): boolean {
const january = new Date(date.getFullYear(), 0, 1).getTimezoneOffset()
const july = new Date(date.getFullYear(), 6, 1).getTimezoneOffset()
return Math.max(january, july) !== date.getTimezoneOffset()
}
/**
* Get the current date in Coordinated Universal Time (UTC).
*/
function getCurrentCoordinatedUniversalTime(): Date {
const currentDate = new Date()
const utcOffset = currentDate.getTimezoneOffset()
currentDate.setMinutes(currentDate.getMinutes() + utcOffset)
return currentDate
}
export const run: ActionFunction = async function (params) {
let cityEntity: SpacyLocationCityEntity | null = null
for (const entity of params.current_entities) {
if (entity.type === 'location:city') {
cityEntity = entity
break
}
}
if (cityEntity == null) {
return await leon.answer({
key: 'city_not_found'
})
}
const { time_zone } = cityEntity.resolution.data
const currentDate = getCurrentCoordinatedUniversalTime()
if (isDaylightSavingTime(currentDate)) {
currentDate.setHours(
currentDate.getHours() + time_zone.daylight_saving_time_offset
)
} else {
currentDate.setHours(
currentDate.getHours() + time_zone.coordinated_universal_time_offset
)
}
await leon.answer({
key: 'current_date_time_with_time_zone',
data: {
weekday: currentDate.toLocaleString(params.lang, { weekday: 'long' }),
month: currentDate.toLocaleString(params.lang, { month: 'long' }),
day: currentDate.getDate(),
year: currentDate.getFullYear(),
hours: zeroPad(currentDate.getHours()),
minutes: zeroPad(currentDate.getMinutes()),
seconds: zeroPad(currentDate.getSeconds()),
city: cityEntity.resolution.data.name,
country: time_zone.country_code
}
})
}