|
|
|
@@ -0,0 +1,48 @@ |
|
|
|
from datetime import datetime |
|
|
|
from typing import Any, Union |
|
|
|
|
|
|
|
import pytz |
|
|
|
|
|
|
|
from core.tools.entities.tool_entities import ToolInvokeMessage |
|
|
|
from core.tools.errors import ToolInvokeError |
|
|
|
from core.tools.tool.builtin_tool import BuiltinTool |
|
|
|
|
|
|
|
|
|
|
|
class TimezoneConversionTool(BuiltinTool): |
|
|
|
def _invoke( |
|
|
|
self, |
|
|
|
user_id: str, |
|
|
|
tool_parameters: dict[str, Any], |
|
|
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]: |
|
|
|
""" |
|
|
|
Convert time to equivalent time zone |
|
|
|
""" |
|
|
|
current_time = tool_parameters.get("current_time") |
|
|
|
current_timezone = tool_parameters.get("current_timezone", "Asia/Shanghai") |
|
|
|
target_timezone = tool_parameters.get("target_timezone", "Asia/Tokyo") |
|
|
|
target_time = self.timezone_convert(current_time, current_timezone, target_timezone) |
|
|
|
if not target_time: |
|
|
|
return self.create_text_message( |
|
|
|
f"Invalid datatime and timezone: {current_time},{current_timezone},{target_timezone}" |
|
|
|
) |
|
|
|
|
|
|
|
return self.create_text_message(f"{target_time}") |
|
|
|
|
|
|
|
@staticmethod |
|
|
|
def timezone_convert(current_time: str, source_timezone: str, target_timezone: str) -> str: |
|
|
|
""" |
|
|
|
Convert a time string from source timezone to target timezone. |
|
|
|
""" |
|
|
|
time_format = "%Y-%m-%d %H:%M:%S" |
|
|
|
try: |
|
|
|
# get source timezone |
|
|
|
input_timezone = pytz.timezone(source_timezone) |
|
|
|
# get target timezone |
|
|
|
output_timezone = pytz.timezone(target_timezone) |
|
|
|
local_time = datetime.strptime(current_time, time_format) |
|
|
|
datetime_with_tz = input_timezone.localize(local_time) |
|
|
|
# timezone convert |
|
|
|
converted_datetime = datetime_with_tz.astimezone(output_timezone) |
|
|
|
return converted_datetime.strftime(format=time_format) |
|
|
|
except Exception as e: |
|
|
|
raise ToolInvokeError(str(e)) |