summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--calc.go25
-rw-r--r--calc_test.go8
-rw-r--r--cell_test.go10
3 files changed, 38 insertions, 5 deletions
diff --git a/calc.go b/calc.go
index a4ecb66..b8cb645 100644
--- a/calc.go
+++ b/calc.go
@@ -489,6 +489,7 @@ type formulaFuncs struct {
// T
// TAN
// TANH
+// TIME
// TODAY
// TRANSPOSE
// TRIM
@@ -6848,6 +6849,30 @@ func (fn *formulaFuncs) NOW(argsList *list.List) formulaArg {
return newNumberFormulaArg(25569.0 + float64(now.Unix()+int64(offset))/86400)
}
+// TIME function accepts three integer arguments representing hours, minutes
+// and seconds, and returns an Excel time. I.e. the function returns the
+// decimal value that represents the time in Excel. The syntax of the Time
+// function is:
+//
+// TIME(hour,minute,second)
+//
+func (fn *formulaFuncs) TIME(argsList *list.List) formulaArg {
+ if argsList.Len() != 3 {
+ return newErrorFormulaArg(formulaErrorVALUE, "TIME requires 3 number arguments")
+ }
+ h := argsList.Front().Value.(formulaArg).ToNumber()
+ m := argsList.Front().Next().Value.(formulaArg).ToNumber()
+ s := argsList.Back().Value.(formulaArg).ToNumber()
+ if h.Type != ArgNumber || m.Type != ArgNumber || s.Type != ArgNumber {
+ return newErrorFormulaArg(formulaErrorVALUE, "TIME requires 3 number arguments")
+ }
+ t := (h.Number*3600 + m.Number*60 + s.Number) / 86400
+ if t < 0 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ return newNumberFormulaArg(t)
+}
+
// TODAY function returns the current date. The function has no arguments and
// therefore. The syntax of the function is:
//
diff --git a/calc_test.go b/calc_test.go
index da95790..89f54ea 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -1016,6 +1016,10 @@ func TestCalcCellValue(t *testing.T) {
"=YEARFRAC(\"02/29/2000\", \"01/29/2001\",1)": "0.915300546448087",
"=YEARFRAC(\"02/29/2000\", \"03/29/2000\",1)": "0.0792349726775956",
"=YEARFRAC(\"01/31/2000\", \"03/29/2000\",4)": "0.163888888888889",
+ // TIME
+ "=TIME(5,44,32)": "0.239259259259259",
+ "=TIME(\"5\",\"44\",\"32\")": "0.239259259259259",
+ "=TIME(0,0,73)": "0.000844907407407407",
// Text Functions
// CHAR
"=CHAR(65)": "A",
@@ -2093,6 +2097,10 @@ func TestCalcCellValue(t *testing.T) {
"=YEARFRAC(42005,42094,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
// NOW
"=NOW(A1)": "NOW accepts no arguments",
+ // TIME
+ "=TIME()": "TIME requires 3 number arguments",
+ "=TIME(\"\",0,0)": "TIME requires 3 number arguments",
+ "=TIME(0,0,-1)": "#NUM!",
// TODAY
"=TODAY(A1)": "TODAY accepts no arguments",
// Text Functions
diff --git a/cell_test.go b/cell_test.go
index 0395ef4..f699c05 100644
--- a/cell_test.go
+++ b/cell_test.go
@@ -268,11 +268,11 @@ func TestGetCellValue(t *testing.T) {
<c r="T1"><v>68.900000000000006</v></c>
<c r="U1"><v>8.8880000000000001E-2</v></c>
<c r="V1"><v>4.0000000000000003E-5</v></c>
- <c r="W1"><v>2422.3000000000002</v></c>
- <c r="X1"><v>1101.5999999999999</v></c>
- <c r="Y1"><v>275.39999999999998</v></c>
- <c r="Z1"><v>68.900000000000006</v></c>
- <c r="AA1"><v>1.1000000000000001</v></c>
+ <c r="W1"><v>2422.3000000000002</v></c>
+ <c r="X1"><v>1101.5999999999999</v></c>
+ <c r="Y1"><v>275.39999999999998</v></c>
+ <c r="Z1"><v>68.900000000000006</v></c>
+ <c r="AA1"><v>1.1000000000000001</v></c>
</row>`)))
f.checked = nil
rows, err = f.GetRows("Sheet1")