I solved this for NZ time, as shown below:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[udf_GetLocalTimeFromUTC]
(
@UTCTime DATETIME
)
RETURNS DATETIME
AS
BEGIN
DECLARE @LocalTime DATETIME
DECLARE @OffSet INT = 12
SELECT @LocalTime = DATEADD(HOUR, @OffSet, @UTCTime)
IF @LocalTime BETWEEN
DATEADD(HOUR, 2, DATEADD(dd, (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(@LocalTime)-1900) * 12 + 3,0))%7)),DATEADD(mm,(YEAR(@LocalTime)-1900) * 12 + 3,0)))
AND
DATEADD(HOUR, 2, DATEADD(dd, -1*(DATEPART(dw, DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @LocalTime)+1, 0)))-1),DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @LocalTime)+1, 0))))
BEGIN
SELECT @LocalTime = @LocalTime
END
ELSE
BEGIN
SELECT @LocalTime = DATEADD(HOUR, 1, @LocalTime)
END
RETURN @LocalTime
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[udf_GetUTCFromLocalTime]
(
@LocalTime DATETIME
)
RETURNS DATETIME
AS
BEGIN
DECLARE @UTCTime DATETIME
DECLARE @OffSet INT = 12
IF @LocalTime BETWEEN
DATEADD(HOUR, 2, DATEADD(dd, (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(@LocalTime)-1900) * 12 + 3,0))%7)),DATEADD(mm,(YEAR(@LocalTime)-1900) * 12 + 3,0)))
AND
DATEADD(HOUR, 2, DATEADD(dd, -1*(DATEPART(dw, DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @LocalTime)+1, 0)))-1),DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @LocalTime)+1, 0))))
BEGIN
SELECT @UTCTime = DATEADD(HOUR, -@OffSet, @LocalTime)
END
ELSE
BEGIN
SELECT @UTCTime = DATEADD(HOUR, -1-@OffSet, @LocalTime)
END
RETURN @UTCTime
END
go