KalleOlaviNiemitalo commented on code in PR #1628:
URL: https://github.com/apache/avro/pull/1628#discussion_r868952116


##########
lang/csharp/src/apache/main/Util/LocalTimestampMillisecond.cs:
##########
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+using System;
+
+namespace Avro.Util
+{
+    /// <summary>
+    /// The 'local-timestamp-millis' logical type.
+    /// </summary>
+    public class LocalTimestampMillisecond : LogicalUnixEpochType<DateTime>
+    {
+        /// <summary>
+        /// The logical type name for LocalTimestampMillisecond.
+        /// </summary>
+        public static readonly string LogicalTypeName = 
"local-timestamp-millis";
+
+        /// <summary>
+        /// Initializes a new LocalTimestampMillisecond logical type.
+        /// </summary>
+        public LocalTimestampMillisecond()
+            : base(LogicalTypeName)
+        {
+        }
+
+        /// <inheritdoc/>
+        public override void ValidateSchema(LogicalSchema schema)
+        {
+            if (Schema.Type.Long != schema.BaseSchema.Tag)
+            {
+                throw new AvroTypeException("'local-timestamp-millis' can only 
be used with an underlying long type");
+            }
+        }
+
+        /// <inheritdoc/>
+        public override object ConvertToBaseValue(object logicalValue, 
LogicalSchema schema)
+        {
+            DateTime date = ((DateTime)logicalValue).ToUniversalTime();
+            return (long)(date - UnixEpochDateTime).TotalMilliseconds;
+        }
+
+        /// <inheritdoc/>
+        public override object ConvertToLogicalValue(object baseValue, 
LogicalSchema schema)
+        {
+            return 
UnixEpochDateTime.AddMilliseconds((long)baseValue).ToLocalTime();

Review Comment:
   Is it correct to convert from UTC to local time here? From 
<https://avro.apache.org/docs/1.11.0/spec.html#Local+timestamp+(millisecond+precision)>,
 I get the impression that 0 should mean 1 January 1970 00:00:00.000 local 
time, rather than 1 January 1970 00:00:00.000 UTC converted to local time. I'd 
really expect the result to have DateTimeKind.Unspecified because it's local 
time but not necessarily local to the computer in which this library is run.
   
   In the Java implementation, LocalTimestampMillisConversion.fromLong first 
converts 0 to 1 January 1970 00:00:00.000 UTC and then drops the UTC time zone 
information, leaving 1 January 1970 00:00:00.000 without a time zone.
   
   
<https://github.com/apache/avro/blob/42822886c28ea74a744abb7e7a80a942c540faa5/lang/java/avro/src/main/java/org/apache/avro/data/TimeConversions.java#L221-L224>
   
   Related test:
   
   
<https://github.com/apache/avro/blob/4e1fefca493029ace961b7ef8889a3722458565a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericLogicalTypes.java#L325-L344>



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to