From 1f85994c4e50e122ec5ebf88f49eaf3d4fb05392 Mon Sep 17 00:00:00 2001 From: wxd-gaming <492794628@qq.com> Date: Wed, 27 Nov 2024 14:24:13 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91lua?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua-test/lua/base/EventLister.lua | 3 + lua-test/lua/base/TimeUtil.lua | 277 ++++++++++++++++++ lua-test/lua/module/TableInsert.lua | 14 +- lua-test/lua/module/TimeTest.lua | 46 --- .../src/main/java/luajava/LuaFileRequire.java | 2 +- .../src/main/java/luajava/LuaService.java | 36 +-- lua-test/luac/src/test/java/code/LuaTest.java | 6 +- .../src/test/java/code/LuaThreadTest.java | 6 +- 8 files changed, 314 insertions(+), 76 deletions(-) create mode 100644 lua-test/lua/base/TimeUtil.lua delete mode 100644 lua-test/lua/module/TimeTest.lua diff --git a/lua-test/lua/base/EventLister.lua b/lua-test/lua/base/EventLister.lua index 5775a36..9c03355 100644 --- a/lua-test/lua/base/EventLister.lua +++ b/lua-test/lua/base/EventLister.lua @@ -3,6 +3,9 @@ --- Created by 無心道(15388152619). --- DateTime: 2024/10/31 16:54 +require("gameDebug") +require("table-extend") + ---事件注册 EventListerTable = {} diff --git a/lua-test/lua/base/TimeUtil.lua b/lua-test/lua/base/TimeUtil.lua new file mode 100644 index 0000000..9b70239 --- /dev/null +++ b/lua-test/lua/base/TimeUtil.lua @@ -0,0 +1,277 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by zhangkai. +--- DateTime: 2024/8/22 下午8:19 +--- +TimeUtil = {} + +--- 将秒时间戳转换为日期表 +function TimeUtil.timeToDate(timestamp) + return os.date("*t", timestamp) +end + +--- 比较两个日期是否相同 +function TimeUtil.datesIsSame(date1, date2) + return date1.year == date2.year and + date1.month == date2.month and + date1.day == date2.day +end + +--- 将秒时间戳转换为%Y-%m-%d %H:%M:%S +function TimeUtil.timeFormat(sec, format) + format = format or "%Y-%m-%d %H:%M:%S" + return os.date(format, sec) +end + +--- 判断两个秒时间戳是否跨天 +function TimeUtil.isSameDay(timestampA, timestampB) + local dateA = TimeUtil.timeToDate(timestampA) + local dateB = TimeUtil.timeToDate(timestampB) + return TimeUtil.datesIsSame(dateA, dateB) +end + +--- 判断两个 毫秒 时间戳是否跨天 +function TimeUtil.isSameDay4Millis(timestampA, timestampB) + return TimeUtil.isSameDay( + math.floor(timestampA / 1000), + math.floor(timestampB / 1000) + ) +end + +--- 比较两个日期是否是同一个周 +---@param stampA number 时间戳毫秒 +---@param stampB number 时间戳毫秒 +function TimeUtil.isSameWeek4Millis(stampA, stampB) + return TimeUtil.isSameWeek( + math.floor(stampA / 1000), + math.floor(stampB / 1000) + ) +end + +--- 比较两个日期是否是同一个周 +---@param stampA number 时间戳秒 +---@param stampB number 时间戳秒 +function TimeUtil.isSameWeek(stampA, stampB) + -- 检查时间戳是否为空 + if not stampA or not stampB then + return false + end + + -- 转换时间戳为日期表 + local dateA = os.date("*t", stampA) + local dateB = os.date("*t", stampB) + + -- 获取每个时间戳对应的一年的第几周 + -- 注意:os.date("*t") 返回的表中没有直接提供周数,需要手动计算 + local weekA = os.date("%W", stampA) + 1 -- %W 返回一年中的第几周,从0开始计数 + local weekB = os.date("%W", stampB) + 1 + + -- 获取每个时间戳对应的年份 + local yearA = dateA.year + local yearB = dateB.year + + -- 比较年份和周数 + return yearA == yearB and weekA == weekB +end + +--- 比较两个日期是否是同一个月 +---@param stampA number 时间戳毫秒 +---@param stampB number 时间戳毫秒 +function TimeUtil.isSameMonth4Millis(stampA, stampB) + return TimeUtil.isSameMonth( + math.floor(stampA / 1000), + math.floor(stampB / 1000) + ) +end + +--- 比较两个日期是否是同一个月 +---@param stampA number 时间戳秒 +---@param stampB number 时间戳秒 +function TimeUtil.isSameMonth(stampA, stampB) + -- 检查时间戳是否为空 + if not stampA or not stampB then + return false + end + + -- 转换时间戳为日期表 + local dateA = os.date("*t", stampA) + local dateB = os.date("*t", stampB) + + -- 获取每个时间戳对应的年份和月份 + local yearA = dateA.year + local monthA = dateA.month + local yearB = dateB.year + local monthB = dateB.month + + -- 比较年份和月份 + return yearA == yearB and monthA == monthB +end + +--- 判断两个时间戳是否在24小时之内 +function TimeUtil.within24hours(timestamp1, timestamp2) + local diff = os.difftime(timestamp2, timestamp1) + return diff <= 24 * 60 * 60 +end + +--判断当前时间是否是每天的凌晨 主要用于每天凌晨的服务器数据刷新 +function TimeUtil.isDayZero(seconds) + local now = TimeUtil.timeToDate(seconds) + return now.hour == 0 and now.min == 0 and now.sec >= 0 +end + +--判断当前时间是否是周一的凌晨 主要用于每周凌晨的服务器数据刷新 +function TimeUtil.isMondayZero(seconds) + local now = TimeUtil.timeToDate(seconds) + return now.wday == 1 and now.hour == 0 and now.min == 0 and now.sec >= 0 +end + +--判断当前时间是否是每月1号的凌晨 主要用于每月凌晨的服务器数据刷新 +function TimeUtil.isMonthZero(seconds) + local now = TimeUtil.timeToDate(seconds) + return now.day == 1 and now.hour == 0 and now.min == 0 and now.sec >= 0 +end + +--- 判断两个秒时间戳是否同一小时 +function TimeUtil.isSameHour4Sec(timestampA, timestampB) + local dateA = TimeUtil.timeToDate(timestampA) + local dateB = TimeUtil.timeToDate(timestampB) + return TimeUtil.isSameHour(dateA, dateB) +end + +--- 比较两个日期是否同一小时 +function TimeUtil.isSameHour(dateA, dateB) + return dateA.year == dateB.year and + dateA.month == dateB.month and + dateA.day == dateB.day and + dateA.hour == dateB.hour +end + +--- 根据秒时间戳获取年月日 00:00:00 +function TimeUtil.creteTimeDayStart4Sec(sec) + local date = TimeUtil.timeToDate(sec) + return TimeUtil.creteTimeDayStart(date.year, date.month, date.day) +end + +--- 获取年月日 00:00:00 时间戳 +function TimeUtil.creteTimeDayStart(year, month, day) + return os.time({ year = year, month = month, day = day, hour = 0, min = 0, sec = 0 }) +end + +--- 结束时间,就是23:59:59 时间戳 +function TimeUtil.creteTimeDayEnd4Sec(sec) + --把指定的时间,添加指定天数的秒后转行成那一天结束时间 + local date = TimeUtil.timeToDate(sec) + return TimeUtil.creteTimeDayEnd(date.year, date.month, date.day) +end + +--- 获取年月日结束时间,就是23:59:59 时间戳 +function TimeUtil.creteTimeDayEnd(year, month, day) + return os.time({ year = year, month = month, day = day, hour = 23, min = 59, sec = 59 }) +end + +--- 计算两个日期之间的天数差,如果返回0表示购买当天 +function TimeUtil.diffDays(sec1, sec2) + local timestamp1 = TimeUtil.creteTimeDayStart4Sec(sec1) + local timestamp2 = TimeUtil.creteTimeDayStart4Sec(sec2) + -- 计算两个时间戳之间的差值 + local difference = math.abs(timestamp2 - timestamp1) + -- 将差值转换成天数 + local days = difference / (24 * 60 * 60) + return math.floor(days) +end + +--- 每天按照某个时间刷新 +---timestampA 当前时间 +---timestampB 上次时间 +---hour 几点刷新 +function TimeUtil.dayFlush(timestampA, timestampB, hour) + local timeDiff = timestampA - timestampB + local oneDay = 24 * 60 * 60 + if timeDiff >= oneDay then + return true + end + local dateA = TimeUtil.timeToDate(timestampA) + local dateB = TimeUtil.timeToDate(timestampB) + if dateA.day ~= dateB.day then + if dateB.hour >= hour and dateA.hour < hour then + return false + end + return true + end + if dateA.hour >= hour and dateB.hour < hour then + return true + end + return false +end + +--- 是否为同一天(以指定的小时为刷新节点) +---t1 当前时间(秒) +---t2 上次时间(秒) +---n 刷新节点(24小时制,不填默认0点) +function TimeUtil.isSameDayWithNum(t1, t2, n) + local diff = string.tonumber(n) * 60 * 60 + return TimeUtil.isSameDay(tonumber(t1) - diff, tonumber(t2) - diff) +end + +---获取本周周一的凌晨时间戳 +---@param sec number 时间戳秒 +function TimeUtil.monday(sec) + -- 获取当前时间 + local date = TimeUtil.timeToDate(sec) + --print("date", sec, date.wday) + -- 计算从周日到今天的天数差,注意 Lua 的 week 中 Sunday 是 1,Monday 是 2 + local daysToMonday = date.wday > 1 and date.wday - 2 or 6 + -- 设置时间为本周一的零点 + date.hour = 0 + date.min = 0 + date.sec = 0 + date.day = date.day - daysToMonday + -- 计算本周一的时间戳 + return os.time(date) +end + +---当前时间追加多少天 +---@param sec number 时间戳秒 +---@param change number 增加的天数 +function TimeUtil.addDay(sec, change) + -- 获取当前时间 + local date = TimeUtil.timeToDate(sec) + date.day = date.day + change + -- 计算本周一的时间戳 + return os.time(date) +end + +---当前时间追加多少天 的开始时间 00:00:00 +---@param sec number 时间戳秒 +---@param change number 增加的天数 +function TimeUtil.addDayStart(sec, change) + -- 获取当前时间 + local date = TimeUtil.timeToDate(sec) + date.day = date.day + change + date.sec = 0 + date.min = 0 + date.hour = 0 + -- 计算本周一的时间戳 + return os.time(date) +end + +---当前时间追加多少天 的结束时间 23:59:59 +---@param sec number 时间戳秒 +---@param change number 增加的天数 +function TimeUtil.addDayEnd(sec, change) + -- 获取当前时间 + local date = TimeUtil.timeToDate(sec) + date.day = date.day + change + date.sec = 59 + date.min = 59 + date.hour = 23 + -- 计算本周一的时间戳 + return os.time(date) +end + +print("dd", TimeUtil.timeFormat(1730540988), TimeUtil.monday(1730540988), TimeUtil.timeFormat(TimeUtil.monday(1730540988))) +print("dd", TimeUtil.timeFormat(1730600988), TimeUtil.monday(1730600988), TimeUtil.timeFormat(TimeUtil.monday(1730600988))) + +print("dd", TimeUtil.timeFormat(os.time()), TimeUtil.monday(os.time()), TimeUtil.timeFormat(TimeUtil.monday(os.time()))) + +print("dd", TimeUtil.addDayEnd(os.time(), 3), TimeUtil.timeFormat(TimeUtil.addDayEnd(os.time(), 3))) \ No newline at end of file diff --git a/lua-test/lua/module/TableInsert.lua b/lua-test/lua/module/TableInsert.lua index e3a9b42..77a47e3 100644 --- a/lua-test/lua/module/TableInsert.lua +++ b/lua-test/lua/module/TableInsert.lua @@ -71,4 +71,16 @@ gameDebug.debug(function() end) print(CheckOpenEventListerTable:triggerResult("0")) -end) \ No newline at end of file +end) + +local tmpList = {} + +for i = 1, 10 do + table.insert(tmpList, tostring(i)) +end + +gameDebug.print(tmpList) + +table.remove(tmpList, 5) + +gameDebug.print(tmpList) \ No newline at end of file diff --git a/lua-test/lua/module/TimeTest.lua b/lua-test/lua/module/TimeTest.lua deleted file mode 100644 index c8b9e9c..0000000 --- a/lua-test/lua/module/TimeTest.lua +++ /dev/null @@ -1,46 +0,0 @@ ---- ---- Generated by EmmyLua(https://github.com/EmmyLua) ---- Created by 無心道(15388152619). ---- DateTime: 2024/11/11 11:27 ---- - -TimeUtil = {} - ---- 将秒时间戳转换为日期表 -function TimeUtil.timeToDate(timestamp) - return os.date("*t", timestamp) -end - ---- 根据毫秒时间戳获取年月日零点时间戳 -function TimeUtil.creteTimeZero4Mill(mill) - local date = TimeUtil.timeToDate(math.floor(mill / 1000)) - return TimeUtil.creteTimeZero(date.year, date.month, date.day) -end - ---- 根据秒时间戳获取年月日零点时间戳 -function TimeUtil.creteTimeZero4Sec(sec) - local date = TimeUtil.timeToDate(sec) - return TimeUtil.creteTimeZero(date.year, date.month, date.day) -end - ---- 获取年月日零点时间戳 -function TimeUtil.creteTimeZero(year, month, day) - print("creteTimeZero", year, month, day) - return os.time({ year = year, month = month, day = day, hour = 0, min = 0, sec = 0 }) -end - ---- 计算两个日期之间的天数差 -function TimeUtil.diff(sec1, sec2) - local timestamp1 = TimeUtil.creteTimeZero4Sec(sec1) - local timestamp2 = TimeUtil.creteTimeZero4Sec(sec2) - -- 计算两个时间戳之间的差值 - local difference = math.abs(timestamp2 - timestamp1) - -- 将差值转换成天数 - local days = difference / (24 * 60 * 60) - return math.floor(days) -end - -local v1 = TimeUtil.creteTimeZero(2024, 11, 11) -local v2 = TimeUtil.creteTimeZero(2024, 11, 15) -print(v1, v2, TimeUtil.diff(v1, v2)) -print(TimeUtil.creteTimeZero4Sec(200000)) diff --git a/lua-test/luac/src/main/java/luajava/LuaFileRequire.java b/lua-test/luac/src/main/java/luajava/LuaFileRequire.java index 0636619..140590c 100644 --- a/lua-test/luac/src/main/java/luajava/LuaFileRequire.java +++ b/lua-test/luac/src/main/java/luajava/LuaFileRequire.java @@ -8,7 +8,7 @@ import java.util.ArrayList; import java.util.List; /** - * 测试 + * lua require 方式加载文件 * * @author: wxd-gaming(無心道, 15388152619) * @version: 2024-10-21 19:21 diff --git a/lua-test/luac/src/main/java/luajava/LuaService.java b/lua-test/luac/src/main/java/luajava/LuaService.java index 3d2c99d..78c8c56 100644 --- a/lua-test/luac/src/main/java/luajava/LuaService.java +++ b/lua-test/luac/src/main/java/luajava/LuaService.java @@ -4,7 +4,6 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.io.Closeable; -import java.util.HashMap; import java.util.concurrent.atomic.AtomicLong; /** @@ -17,10 +16,10 @@ import java.util.concurrent.atomic.AtomicLong; @Getter public class LuaService implements AutoCloseable, Closeable { - private HashMap runtimeHashMap = new HashMap<>(); + LuaRuntime luaRuntime; - public static LuaService of(LuaType luaType, boolean useModule, boolean xpcall, String paths) { - LuaService luaService = new LuaService(luaType, useModule, xpcall, paths); + public static LuaService of(LuaType luaType, boolean xpcall, String paths) { + LuaService luaService = new LuaService(luaType, xpcall, paths); luaService.init(); return luaService; } @@ -29,24 +28,23 @@ public class LuaService implements AutoCloseable, Closeable { boolean xpcall; String paths; - protected LuaService(LuaType luaType, boolean useModule, boolean xpcall, String paths) { + protected LuaService(LuaType luaType, boolean xpcall, String paths) { this.luaType = luaType; this.xpcall = xpcall; this.paths = paths; } public void init() { - HashMap tmpRuntimeHashMap = new HashMap<>(); - LuaRuntime luaRuntime = new LuaRuntime(luaType, "root", xpcall, paths); - tmpRuntimeHashMap.put(luaRuntime.getName(), luaRuntime); - HashMap tmp = runtimeHashMap; - runtimeHashMap = tmpRuntimeHashMap; - if (tmp != null && !tmp.isEmpty()) { + LuaRuntime _luaRuntime = new LuaRuntime(luaType, "root", xpcall, paths); + LuaRuntime old = luaRuntime; + luaRuntime = _luaRuntime; + + if (old != null) { new Thread(() -> { try { Thread.sleep(30_000); - tmp.values().forEach(LuaRuntime::close); + old.close(); } catch (Exception e) { throw new RuntimeException(e); } @@ -55,27 +53,21 @@ public class LuaService implements AutoCloseable, Closeable { } public LuaRuntime getRuntime() { - return runtimeHashMap.get("root"); - } - - public LuaRuntime getRuntime(String name) { - return runtimeHashMap.get(name); + return luaRuntime; } public long memory() { AtomicLong atomicLong = new AtomicLong(); - runtimeHashMap.values().forEach(v -> v.memory(atomicLong)); + luaRuntime.memory(atomicLong); return atomicLong.get(); } public long size() { - return runtimeHashMap.values().stream().mapToLong(LuaRuntime::size).sum(); + return luaRuntime.size(); } @Override public void close() { - for (LuaRuntime runtime : runtimeHashMap.values()) { - runtime.close(); - } + luaRuntime.close(); } } diff --git a/lua-test/luac/src/test/java/code/LuaTest.java b/lua-test/luac/src/test/java/code/LuaTest.java index 31fe306..a95b72d 100644 --- a/lua-test/luac/src/test/java/code/LuaTest.java +++ b/lua-test/luac/src/test/java/code/LuaTest.java @@ -23,15 +23,15 @@ public class LuaTest { LuaService luaService; public void createLUA54() { - luaService = LuaService.of(LuaType.LUA54, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUA54, true, "../lua"); } public void createLUAJit() { - luaService = LuaService.of(LuaType.LUAJit, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUAJit, true, "../lua"); } public void createLUAJ() { - luaService = LuaService.of(LuaType.LUAJ, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUAJ, true, "../lua"); } diff --git a/lua-test/luac/src/test/java/code/LuaThreadTest.java b/lua-test/luac/src/test/java/code/LuaThreadTest.java index c28cd8c..42b8984 100644 --- a/lua-test/luac/src/test/java/code/LuaThreadTest.java +++ b/lua-test/luac/src/test/java/code/LuaThreadTest.java @@ -18,15 +18,15 @@ public class LuaThreadTest { LuaService luaService; public void createLUAJ() { - luaService = LuaService.of(LuaType.LUAJ, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUAJ, true, "../lua"); } public void createLUA54() { - luaService = LuaService.of(LuaType.LUA54, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUA54, true, "../lua"); } public void createLUAJit() { - luaService = LuaService.of(LuaType.LUAJit, false, true, "../lua"); + luaService = LuaService.of(LuaType.LUAJit, true, "../lua"); } @Test