1. 程式人生 > >Lua中日期和時間函式詳解

Lua中日期和時間函式詳解

最近在做Lua指令碼的時候,用到了Lua的日期和時間函式,發現其功能強大,學習一下!在Lua中,函式time和

data提供了所有的日期和時間的功能,下面將這兩個函式分開學習。

time函式:

如果不帶任何引數呼叫time,它會返回一個數字,表示當前的日期和時間,改數字為某一時刻到此刻的秒數。
如: local current_time = os.time(); -- 返回的結果可能是 1503365680 這樣一串數字

time還可以用一個table作為一個引數呼叫它,它會返回從某一時刻都table中時刻的秒數,table引數內容
year  一個完整的年份
month 01 - 12
day01 - 31
hour00 - 23
min00 - 59
sec00 - 59
isdst一個布林值,true表示夏令時
其中年月份必須填寫,不可省略,後面的其他欄位可填可不填。
思考:既然只需要填寫年月日就可以獲得一個時刻都年月日的秒數,那麼lua預設表中的時分秒為多少呢?
於是筆者做了以下測試:
local time1 = os.time{year = 2000, month = 1, day = 1};
print(time1);-- 結果為946 699 200
local time2 = os.time{year = 2000, month = 1, day = 1, hour = 12};
print(time2);-- 結果為946 699 200
local time3 = os.time{year = 2000, month = 1, day = 1, hour = 12, min = 1};
print(time3);-- 結果為946 699 260
local time4 = os.time{year = 2000, month = 1, day = 1, hour = 12, min = 1, sec = 1};
print(time4);-- 結果為946 699 261
通過測試可以看出,Lua中當你引數table值填年月日時,Lua預設hour = 12, min = 0, sec = 0

data函式:

函式data是time的一個反函式,它可以將一個表示日期和時間的數字轉換成某些高階的表現形式。
該函式有兩個引數:
第一個引數為格式字串,指定了期望的表示形式;
第二個引數是日期和時間的數字,預設為當前日期和時間。<可不填>
其中第一個引數中,date函式支援以下這些格式:
%a一個星期中天數的簡寫(如:Wed) 
%A 一個星期中天數的全稱(如: Wednesday) 
%b月份的簡寫(如: Sep) 
%B月份的全稱(如:September) 
%c日期和時間(如: 08/22/2017 10:50:05) 
%d一個月中的第幾天(22) [0 - 31] 
%H24小時中的小時數(15) [0 - 23]  
%I12小時中的小時數(8)[1 - 12]  

%j一年中的第幾天(259)[1 - 366]   

%M分鐘數 (48) [0 - 59] 

%m月份數 (09) [1 - 12] 
%p"上午(am)"或"下午(pm)" (如: pm) 
%S秒數(10) [0 - 59] 
%w一個星期中的第幾天(3) [0 - 6 周天-週六] 
%x日期(如:08/22/17) 
%X時間(如:10:50:05) 
%y兩位數的年份(17) [00 - 99] 
%Y完整的年份(2017) 
%%字元'%' 

除了以上格式外,data函式還闊以通過字串"*t",其返回一個table如
local date = os.date("*t", os.time());
--結果為date = {year = 2017, month = 8, day = 22, yday = 234, wday = 3,

hour = 10, min = 46, sec = 52, isdst = false}

應用:

我們在Lua中經常會用到這兩個函式來格式化我們的日期和時間,然後在自由組合自己想要的格式,下面來寫幾個介面實踐下:

local fmt_date = function(year, month, day, fmt)
	if (fmt == "DD/MM/YY") then
		return string.format("%02d/%02d/%02d", day, month, year);
	elseif (fmt == "MM/DD/YY") then
		return string.format("%02d/%02d/%02d", month, day, year);
	else
		return string.format("%02d/%02d/%02d", year, month, day);
	end
end

local fmt_hms = function(hour, min, sec, TIME_24H_Flag)	
	if (nil ~= sec) then
		assert((nil ~= hour) and (nil ~= min));
		
		if (TIME_24H_Flag) then
			return string.format("%02d:%02d:%02d", hour, min, sec);
		else
			local h = math.floor(tonumber(hour));
			
			if (h < 12) then
				if (0 == h) then h = 12; end
				return string.format("%02d:%02d:%02d AM", h, min, sec);
			else
				if (12 == h) then h = 24; end
				return string.format("%02d:%02d:%02d PM", h-12, min, sec);
			end
		end
	elseif (nil ~= min) then
		assert(nil ~= hour);
		
		if (TIME_24H_Flag) then
			return string.format("%02d:%02d", hour, min);
		else
			local h = math.floor(tonumber(hour));
			
			if (h < 12) then
				if (0 == h) then h = 12; end
				return string.format("%02d:%02d AM", h, min);
			else
				if (12 == h) then h = 24; end
				return string.format("%02d:%02d PM", h-12, min);
			end
		end
	else
		assert(nil ~= hour);
		
		if (TIME_24H_Flag) then
			return string.format("%02d", hour);
		else
			local h = math.floor(tonumber(hour));
			
			if (h < 12) then
				if (0 == h) then h = 12; end
				return string.format("%02d:00 AM", h);
			else
				if (12 == h) then h = 24; end
				return string.format("%02d:00 PM", h-12);
			end
		end
	end
end

local fmt_time = function(wday_flag, year, mon, mday, hour, min, sec)
	if ((nil ~= year) and (nil ~= mon) and (nil ~= mday) and (nil ~= hour) and (nil ~= min) and (nil ~= sec)) then
		if (("boolean" == type(wday_flag)) and (wday_flag)) then
			local week = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
			local w = os.date("%w", os.time{year=year, month=mon, day=mday});
			local day = math.floor(tonumber(w)) + 1;
			
			return string.format("%s %s %s", fmt_date(year, mon, mday), fmt_hms(hour, min, sec), week[day]);
		else
			return string.format("%s %s", fmt_date(year, mon, mday), fmt_hms(hour, min, sec));
		end
	end
	
	if ((nil ~= year) and (nil ~= mon) and (nil ~= mday) and (nil == hour) and (nil == min) and (nil == sec)) then
		if (("boolean" == type(wday_flag)) and (wday_flag)) then
			local week = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
			local w = os.date("%w", os.time{year = year, month = mon, day = mday});
			local day = math.floor(tonumber(w)) + 1;
			
			return string.format("%s %s", fmt_date(year, mon, mday), week[day]);
		else
			return string.format("%s", fmt_date(year, mon, mday));
		end
	end
	
	if ((nil == year) and (nil == mon) and (nil == mday) and (nil ~= hour) and (nil ~= min)) then
		return string.format("%s", fmt_hms(hour, min, sec));
	end
end

--測試
local time = os.date("%Y/%m/%d %H:%M:%S", os.time());
local year, mon, mday, hour, min, sec = string.match(time, "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)");
print(fmt_time(false, year, mon, mday));  --2017/08/22
print(fmt_time(false, nil, nil, nil, hour, min, sec)); --11:09:13 AM

相關推薦

Lua日期時間函式

最近在做Lua指令碼的時候,用到了Lua的日期和時間函式,發現其功能強大,學習一下!在Lua中,函式time和data提供了所有的日期和時間的功能,下面將這兩個函式分開學習。 time函式: 如果不帶任何引數呼叫time,它會返回一個數字,表示當前的日期和時間,改數字為

JDK8版本之日期時間API

nds 可變 nan r.java 允許 應該 之一 常用 技巧 伴隨lambda表達式、streams以及一系列小優化,Java 8 推出了全新的日期時間API,在教程中我們將通過一些簡單的實例來學習如何使用新API。Java處理日期、日歷和時間的方式一直為社區所詬病,將

C++getgetline函式

get函式函式原型有多個,其中比較簡單的2個是:char get(); istream &get(char c);前者提取的字元作為函式值,後者提取的字元賦值給引數c,使用get函式從鍵盤提取自負的格式分別為:cin.get(); cin.get(字元變數c);#in

linuxalarm函式pause函式例項

轉載原文:https://www.cnblogs.com/yxk529188712/p/4982401.html alarm(time);執行之後告訴核心,讓核心在time秒時間之後向該程序傳送一個定時訊號,然後該程序捕獲該訊號並處理; pause()函式使該程序暫停讓出CPU,但是該函式的暫停

sql的round函式cast函式

 <一>:ROUND函式主要返回數字表達式並四捨五入為指定的長度或精度。 語法格式如下: ROUND(numeric_expression,length[,function]) 引數說明: 1.numeric_expression:精確數字或近擬數字資料型別類別的

Lua函數語言程式設計區域性函式

         函數語言程式設計中的函式這個術語不是指計算機中的函式(實際上是Subroutine),而是指數學中的函式,即自變數的對映。也就是說一個函式的值僅決定於函式引數的值,不依賴其他狀態。比如sqrt(x)函式計算x的平方根,只要x不變,不論什麼時候呼叫,呼叫幾次

Socketsend()函式recv()函式

1、send函式 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不論是客戶還是伺服器應用程式都用send函式來向TCP連線的另一端傳送資料。 客戶程式一般用send函式向伺服器傳送請求,而伺

JAVA日期時間的格式化選項

println 對象 bsp lec pub cti class 日子 月份 一、使用printf方法 1 import java.util.Date; 2 import java.util.Scanner; 3 4 5 public class Test

Android StudioGitGitHub使用

可能 必須 窗口 gin 擁有 說明 詳細 對話 發現   一、Git和GitHub簡述    1.Git    分布式版本控制系統,最先使用於Linux社區,是一個開源免費的版本控制系統,功能類似於SVN和CVS。Git與其他版本管理工具最大的區別點和優點就是分布式;  

Linuxtopfree命令(轉)

機器 負載 選擇 就會 image 的區別 包括 linux中 占用內存 top:命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表. 該命令可以按CPU使用.內存使用和執行時間對任務進行排序; 而且該命令的很多特性都可以通過交互式命令或者在個

Python日期時間進行操作timedatetime

Python中提供了多個用於對日期和時間進行操作的內建模組:time模組、datetime模組和calendar模組。其中time模組是通過呼叫C庫實現的,所以有些方法在某些平臺上可能無法呼叫,但是其提供的大部分介面與C標準庫time.h基本一致。time模組相比,datetime模組提供的介面更直

mallocfree函式(轉載只是為了查閱方便,若侵權立刪)

malloc和free函式詳解   本文介紹malloc和free函式的內容。   在C中,對記憶體的管理是相當重要。下面開始介紹這兩個函式:     一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(lon

python日期時間格式化

本文例項總結了python中日期和時間格式化輸出的方法。分享給大家供大家參考。具體分析如下: python格式化日期時間的函式為datetime.datetime.strftime();由字串轉為日期型的函式為:datetime.datetime.strptime(),兩個函式都涉及日期時間的格

PL/SQL單行函式函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PostgreSQL學習手冊(格式化時間函式)

1、簡介 最近在學習PostgreSQL 遇到了一些麻煩,就是時間的轉換問題,然後找了好久終於被我找到了一個,碼上。 2、資料型別格式化函式: PostgreSQL格式化函式提供一套有效的工具用於把各種資料型別(日期/時間、integer、floating

Linux 多工程式設計——多程序建立:fork() vfork() 函式

一、fork() 函式詳解 需要的標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用於從一個已存在的程序中建立一個新程序,新程序稱為子程序,原程序稱為父程序。

setjmp()longjmp()函式

今天看《unix環境高階程式設計》發現這兩個函式,還挺有用的,在c異常處理、協程等作用很大。 使用方法 我們知道,想要實現函式內的跳轉可以使用goto語句,但如果需要從一個函式跳轉到另一個函式,goto是不能完成的,那該如何實現呢? 函式間跳轉原理 示例程式碼: void

C語言itoa()函式atoi()函式(整數轉字元)

轉自:http://c.biancheng.net/cpp/html/792.html C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串。 以下是用itoa()函式將整數轉換為字串的一個例子:# include <stdio.h># include

Linux ps top命令

ps 和 top 命令常用來檢視Linux系統程序相關資訊。 ps命令:可以檢視程序的瞬間資訊。 top命令:可以持續的監視程序的資訊。 場景一:如何檢視Linux系統中存在mysql、nginx、tomcat程序? 方法一:輸入命令:ps -ef|grep

前端學習筆記之jsapply()call()方法

經過網上的大量搜尋,漸漸明白了apply()和call方法的使用,為此寫一篇文章記錄一下。 定義 apply()方法: Function.apply(obj,args)