(Godot Engine)如何计算特定日期的ISO周数?

问题描述 投票:0回答:1

在 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 的答案,无论我纠正多少次。 (总是提示不存在的类和方法)

powershell date godot gdscript week-number
1个回答
0
投票

所以我想出了以下解决方案:

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

© www.soinside.com 2019 - 2024. All rights reserved.