[
https://issues.apache.org/jira/browse/AVRO-3078?focusedWorklogId=768359&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-768359
]
ASF GitHub Bot logged work on AVRO-3078:
----------------------------------------
Author: ASF GitHub Bot
Created on: 10/May/22 08:16
Start Date: 10/May/22 08:16
Worklog Time Spent: 10m
Work Description: 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>
Issue Time Tracking
-------------------
Worklog Id: (was: 768359)
Time Spent: 40m (was: 0.5h)
> C#: Logical type 'local-timestamp-millis'
> -----------------------------------------
>
> Key: AVRO-3078
> URL: https://issues.apache.org/jira/browse/AVRO-3078
> Project: Apache Avro
> Issue Type: Improvement
> Components: csharp
> Affects Versions: 1.10.2
> Reporter: Vladimir Kralik
> Assignee: Zoltan Csizmadia
> Priority: Critical
> Labels: pull-request-available
> Fix For: 1.11.1, 1.12.0
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> * *as* a programmer
> * *i want* to add support for logical type {{local-timestamp-millis}} for C#
> code generation
> * *because* {{avrogen}} fails withÂ
> {code:bash}
> > dotnet tool install --global Apache.Avro.Tools --version 1.10.2
> > dotnet tool restore
> Tool 'apache.avro.tools' (version '1.10.2') was restored. Available commands:
> avrogen
> > dotnet avrogen -p ../thymus.avpr outdir
> Exception occurred. Logical type 'local-timestamp-millis' is not supported.
> {code}
> {code:java}
> {
> "protocol" : "ThymusProtocol",
> "namespace" : "model.thymus",
> "types" : [ {
> "type" : "record",
> "name" : "TMVyk",
> "namespace" : "model.thymus",
> "fields" : [{
> "name" : "cas",
> "type" : {
> "type" : "long",
> "logicalType" : "local-timestamp-millis"
> }
> }]
> } ],
> "messages" : { }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.7#820007)