@@ -180,6 +180,10 @@ var timesModule = map[string]tengo.Object{
180180 Name : "to_utc" ,
181181 Value : timesToUTC ,
182182 }, // to_utc(time) => time
183+ "in_location" : & tengo.UserFunction {
184+ Name : "in_location" ,
185+ Value : timesInLocation ,
186+ }, // in_location(time, location) => time
183187}
184188
185189func timesSleep (args ... tengo.Object ) (ret tengo.Object , err error ) {
@@ -430,7 +434,7 @@ func timesDate(args ...tengo.Object) (
430434 ret tengo.Object ,
431435 err error ,
432436) {
433- if len (args ) != 7 {
437+ if len (args ) < 7 || len ( args ) > 8 {
434438 err = tengo .ErrWrongNumArguments
435439 return
436440 }
@@ -499,9 +503,29 @@ func timesDate(args ...tengo.Object) (
499503 return
500504 }
501505
506+ var loc * time.Location
507+ if len (args ) == 8 {
508+ i8 , ok := tengo .ToString (args [7 ])
509+ if ! ok {
510+ err = tengo.ErrInvalidArgumentType {
511+ Name : "eighth" ,
512+ Expected : "string(compatible)" ,
513+ Found : args [7 ].TypeName (),
514+ }
515+ return
516+ }
517+ loc , err = time .LoadLocation (i8 )
518+ if err != nil {
519+ ret = wrapError (err )
520+ return
521+ }
522+ } else {
523+ loc = time .Now ().Location ()
524+ }
525+
502526 ret = & tengo.Time {
503527 Value : time .Date (i1 ,
504- time .Month (i2 ), i3 , i4 , i5 , i6 , i7 , time . Now (). Location () ),
528+ time .Month (i2 ), i3 , i4 , i5 , i6 , i7 , loc ),
505529 }
506530
507531 return
@@ -1113,6 +1137,46 @@ func timesTimeLocation(args ...tengo.Object) (
11131137 return
11141138}
11151139
1140+ func timesInLocation (args ... tengo.Object ) (
1141+ ret tengo.Object ,
1142+ err error ,
1143+ ) {
1144+ if len (args ) != 2 {
1145+ err = tengo .ErrWrongNumArguments
1146+ return
1147+ }
1148+
1149+ t1 , ok := tengo .ToTime (args [0 ])
1150+ if ! ok {
1151+ err = tengo.ErrInvalidArgumentType {
1152+ Name : "first" ,
1153+ Expected : "time(compatible)" ,
1154+ Found : args [0 ].TypeName (),
1155+ }
1156+ return
1157+ }
1158+
1159+ s2 , ok := tengo .ToString (args [1 ])
1160+ if ! ok {
1161+ err = tengo.ErrInvalidArgumentType {
1162+ Name : "second" ,
1163+ Expected : "string(compatible)" ,
1164+ Found : args [1 ].TypeName (),
1165+ }
1166+ return
1167+ }
1168+
1169+ location , err := time .LoadLocation (s2 )
1170+ if err != nil {
1171+ ret = wrapError (err )
1172+ return
1173+ }
1174+
1175+ ret = & tengo.Time {Value : t1 .In (location )}
1176+
1177+ return
1178+ }
1179+
11161180func timesTimeString (args ... tengo.Object ) (ret tengo.Object , err error ) {
11171181 if len (args ) != 1 {
11181182 err = tengo .ErrWrongNumArguments
0 commit comments