在 Windows 上使用 Godot 3.6: 如何计算给定以下参数的日期的 ISO 周数:
day
, month
, year
?
我找不到从内置类中计算周数的方法Time
我还查看了 Ivan Skodje 的 Godot Engine 3.2.3 回购的 Calendar Button 插件,但找不到任何答案或灵感。
我设法实现这一目标的一种方法是使用
PowerShell
通过使用以下自定义方法:
# Executes the [ script ] in Windows PowerShell
static func execute(script, open_console: bool = false, freeze_loop: bool = true) -> Array:
if OS.get_name() != "Windows":
return []
var output: Array = []
var arguments: PoolStringArray = PoolStringArray([])
match typeof(script):
TYPE_STRING:
arguments.append(script as String)
TYPE_ARRAY, TYPE_STRING_ARRAY:
for line in script:
arguments.append("\n%s" % line)
_:
return []
OS.execute("powershell.exe", arguments, freeze_loop, output, false, open_console)
return output
受以下答案启发:Get the ISO 8601 Week of Year of a given date in Powershell
# Returns the ISO week number of the specified date
static func get_iso_week(day: int, month: int, year: int) -> int:
var script: PoolStringArray = PoolStringArray([
"$date = [DateTime] '%d-%d-%d'" % [year, month, day],
("(Get-Culture).Calendar.GetWeekOfYear(($date).AddDays(-[Int]"
+ "(($date).AddDays(-1)).DayOfWeek+3), 2, 1)")
])
var result: Array = execute(script)
if result.empty():
return 0
return result[0].to_int()
使用上面的方法^结果是准确的和预期的一样,但是执行时间很慢,尤其是当调用这个函数6次时(标准日历中每周行一次),我不知道如何编程
PowerShell
中的方法可以通过指定的 month
和 year
返回所有周数的列表(这是,只执行一次 PowerShell
执行而不是 6,但我仍然觉得这个次优)
ChatGPT 也找不到适合Godot 3.6 的答案,无论我纠正多少次。 (总是提示不存在的类和方法)
所以我想出了以下解决方案:
static func get_iso_week_number(day: int, month: int, year: int) -> int:
var start: int = OS.get_unix_time_from_datetime({"year": year, "month": 1, "day": 1})
var current: int = OS.get_unix_time_from_datetime({"year": year, "month": month, "day": day})
var days_since_year_start: float = (current - start) / 86400.0
var iso_day_of_year: int = int(days_since_year_start) + 1
var iso_weekday: int = (int(days_since_year_start) - 1) % 7
var iso_week_start: int = current - (86400 * iso_weekday) - (86400 * (iso_day_of_year - 1))
var iso_week_number: int = int((iso_day_of_year - iso_weekday + 10) / 7)
if iso_week_number < 1:
iso_week_number = get_iso_week_number(31, 12, year - 1)
elif iso_week_number > 52:
if get_iso_week_number(1, 1, year + 1) == 1:
iso_week_number = 1
return iso_week_number
在使用 2023 年的日期进行测试时,除了 2023 年 1 月 1 日之外,每个星期的数字似乎都可以,结果返回为 1 而不是 52