{"id":144979,"date":"2021-05-17T10:43:00","date_gmt":"2021-05-17T09:43:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-datetime-0-2-0-is-out\/"},"modified":"2021-05-24T17:31:21","modified_gmt":"2021-05-24T16:31:21","slug":"kotlinx-datetime-0-2-0-is-out","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/de\/kotlin\/2021\/05\/kotlinx-datetime-0-2-0-is-out\/","title":{"rendered":"kotlinx-datetime 0.2.0 ist da"},"content":{"rendered":"\n<p>Heute stellen wir <code>kotlinx-datetime<\/code> <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-datetime\/releases\/tag\/v0.2.0\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">0.2.0<\/a> vor \u2014 eine neue Version unserer Multiplattform-Bibliothek f\u00fcr die Arbeit mit Daten und Zeiten, die zusammen mit Kotlin 1.5.0 ver\u00f6ffentlicht wurde. Wir haben die allererste Version der Bibliothek letzten Sommer ver\u00f6ffentlicht, und dies ist unser n\u00e4chster Schritt auf dem Weg zu einem stabilen Release.<\/p>\n\n\n\n<p>Wir haben <code>kotlinx-datetime<\/code> auf dem Kotlin 1.4 Online Event vorgestellt: Sie k\u00f6nnen sich <a href=\"https:\/\/youtu.be\/YwN0kAMNvXI\" target=\"_blank\" rel=\"noopener\">diesen Vortrag von Ilya Gorbunov<\/a> ansehen, um mehr \u00fcber die Designprinzipien und Funktionen der Bibliothek zu erfahren. Sollten Sie Fragen zu <code>kotlinx-datetime<\/code> haben, empfehlen wir Ihnen, am kommenden <a href=\"https:\/\/pages.jetbrains.com\/kotlin-online-event-2021\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Kotlin 1.5 Online-Event<\/a> teilzunehmen und Ihre Fragen an das Kotlin-Team zu stellen.<\/p>\n\n\n\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Registrieren\" href=\"https:\/\/pages.jetbrains.com\/kotlin-online-event-2021\" target=\"_blank\" rel=\"noopener\">F\u00fcr Online-Event registrieren<\/a><\/p>\n\n\n\n<p>Die Version 0.2.0 kommt mit zahlreichen Verbesserungen:<\/p>\n\n\n\n<ul><li>Unterst\u00fctzung von <code>kotlinx.serialization<\/code><\/li><li>Normalisierung von <code>DateTimePeriod<\/code>-Komponenten<\/li><li>Parsing f\u00fcr <code>Instant<\/code> aus einem String mit einem UTC-Offset<\/li><\/ul>\n\n\n\n<p><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/05\/kotlinx-datetime-0-2-0-is-out\/#give-it-a-try\" class=\"ek-link\">Probieren Sie es aus!<\/a> \u2013 Stellen Sie nur sicher, dass Sie Kotlin Version 1.5.0 installiert haben. Schauen wir uns die Funktionen genauer an!<\/p>\n\n\n\n<p><span id=\"more-141658\"><\/span><\/p>\n<div style=\"background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; font-size: ; line-height: ; text-align: left;min-height: px;\">\nBitte beachten Sie, dass kotlinx-datetime 0.2.0 noch <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">experimentell<\/a> ist. Die API kann sich jederzeit \u00e4ndern.\n<\/div>\n\n\n\n<h2 id=\"kotlinx-serialization-support\">Unterst\u00fctzung von <code>kotlinx.serialization<\/code><\/h2>\n\n\n\n<p><code>kotlinx-datetime<\/code> bietet eigene <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-datetime#types\" target=\"_blank\" rel=\"noopener\">Typen<\/a> zur Darstellung von Datum und Uhrzeit: wie <code>Instant<\/code>, <code>LocalDate<\/code>, und <code>TimeZone<\/code>. Mit Version 0.2.0 sind nun alle diese Typen serialisierbar, da sie von der <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>kotlinx.serialization<\/code><\/a>-Bibliothek unterst\u00fctzt werden. Wir stellen die Menge der Serialisierer im Paket <code>kotlinx.datetime.serializers<\/code> bereit, das Sie geb\u00fcndelt in der Bibliothek finden.<\/p>\n\n\n\n<p>Die meisten Typen haben nun den Standard-Serialisierer. Die Typen, die dies haben, sind <code>Instant<\/code>, <code>LocalDate<\/code>, <code>LocalDateTime<\/code>, <code>DateTimePeriod<\/code>, <code>DatePeriod<\/code>, <code>TimeZone<\/code>, und <code>ZoneOffset<\/code>. Sie k\u00f6nnen als Eigenschaften in Ihren serialisierbaren Klassen ohne explizite Annotationen verwendet werden:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport kotlinx.datetime.LocalDate\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.encodeToString\n\n@Serializable\nclass Person(val name: String, val birthDate: LocalDate)\n\nfun main() {\n    val harry = Person(&quot;Harry&quot;, LocalDate(1980, 7, 31))\n    println(Json.encodeToString(harry))\n    \/\/ {&quot;name&quot;:&quot;Harry&quot;,&quot;birthDate&quot;:&quot;1980-07-31&quot;}\n}\n<\/pre>\n\n\n\n<p>Der Standard-Serialisierer basiert auf einer <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISO_8601\" target=\"_blank\" rel=\"noopener\">ISO 8601<\/a>-Stringdarstellung eines Typs und verwendet <code>toString()<\/code>\/<code>parse()<\/code>, um Werte zu serialisieren und zu deserialisieren.<\/p>\n\n\n\n<p>Einige der Typen verf\u00fcgen \u00fcber alternative Serialisierer, um die Verwendung unterschiedlicher Serialisierungsstrategien zu erm\u00f6glichen, die bei bestimmten Formaten effizienter als der Standard sein k\u00f6nnen. Zum Beispiel kann <code>LocalDate<\/code> komponentenweise mit <code>LocalDateComponentSerializer<\/code> serialisiert werden. Um einen Serialisierer explizit zu w\u00e4hlen, verwenden Sie die regul\u00e4re <a href=\"https:\/\/kotlin.github.io\/kotlinx.serialization\/kotlinx-serialization-core\/kotlinx-serialization-core\/kotlinx.serialization\/-serializable\/index.html\" target=\"_blank\" rel=\"noopener\"><code>@Serializable(with = ...)<\/code><\/a> Annotation. Sie k\u00f6nnen diese Wahl auch auf die Laufzeit verschieben, indem Sie den <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\/blob\/master\/docs\/serializers.md#contextual-serialization\" target=\"_blank\" rel=\"noopener\">kontextbezogenen Serializer<\/a> verwenden.<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport kotlinx.datetime.LocalDate\nimport kotlinx.datetime.serializers.LocalDateComponentSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.encodeToString\n\n@Serializable\nclass Person(\n    val name: String,\n    @Serializable(with = LocalDateComponentSerializer::class)\n    val birthDate: LocalDate\n)\n\nfun main() {\n    val harry = Person(&quot;Harry&quot;, LocalDate(1980, 7, 31))\n    println(Json.encodeToString(harry))\n    \/\/ {&quot;name&quot;:&quot;Harry&quot;,&quot;birthday&quot;:{&quot;year&quot;:1980,&quot;month&quot;:7,&quot;day&quot;:31}}\n}\n<\/pre>\n\n\n\n<p>Es gibt auch Typen, die keinen Serialisierer haben: <code>DayOfWeek<\/code> und <code>Month<\/code> werden von <code>kotlinx.serialization<\/code> als einfache Enums unterst\u00fctzt.<\/p>\n\n\n\n<p>Beachten Sie, dass <code>kotlinx.serialization<\/code> eine optionale Abh\u00e4ngigkeit von <code>kotlinx-datetime<\/code> ist. Um die Serialisierungsfunktionen zu nutzen, f\u00fcgen Sie Ihrem Projekt neben <code>kotlinx-datetime<\/code> die Abh\u00e4ngigkeit <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization#dependency-on-the-json-library\" target=\"_blank\" rel=\"noopener\"><code>kotlinx-serialization-core<\/code><\/a> hinzu.<\/p>\n\n\n\n<h2>Normalisierung von <code>DateTimePeriod<\/code>-Komponenten<\/h2>\n\n\n\n<p>Die Klasse <code>DateTimePeriod<\/code> repr\u00e4sentiert den Zeitraum zwischen 2 Zeitpunkten als eine Kombination verschiedener Zeiteinheitstypen: Jahre, Monate, Tage, Stunden, Minuten, Sekunden und Nanosekunden. F\u00fcr jeden dieser Zeiteinheitstypen hat die Klasse eine entsprechende Eigenschaft, die einen Wert vom Konstruktorparameter erh\u00e4lt, z.B.: <code>DateTimePeriod(months = 14, minutes = 90)<\/code>.<\/p>\n\n\n\n<p>Bisher waren die Komponenten unabh\u00e4ngig und hielten nur die an den Konstruktor \u00fcbergebenen Werte. Dies konnte jedoch zu F\u00e4llen f\u00fchren, in denen zwei Objekte mit unterschiedlichen Komponentenwerten nicht gleich waren, aber die gleiche ISO-Darstellung hatten. Die Serialisierung eines solchen Wertes und die anschlie\u00dfende Deserialisierung konnte zu einem anderen Wert als dem urspr\u00fcnglichen f\u00fchren.<\/p>\n\n\n\n<p>In dieser Version haben wir die interne Darstellung von <code>DateTimePeriod<\/code> ge\u00e4ndert und einen Schritt zur Normalisierung der Komponenten zu seinem Konstruktor hinzugef\u00fcgt. Die Komponenten werden nun intern auf eine Kombination aus Nanosekunden, Tagen und Monaten normalisiert, was das anf\u00e4ngliche Problem l\u00f6st und au\u00dferdem daf\u00fcr sorgt, dass der vom Getter der Komponenteneigenschaft zur\u00fcckgegebene Wert auch dann leicht zu lesen ist, wenn er gro\u00df ist.<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nval period1 = DateTimePeriod(months = 14, minutes = 90)\nval period2 = DateTimePeriod(years = 1, months = 2, hours = 1, minutes = 30)\nprintln(period1 == period2)  \/\/ true\nprintln(period1)             \/\/ P1Y2MT1H30M \/\/ ISO-8601\nprintln(period2)             \/\/ P1Y2MT1H30M \/\/ ISO-8601\nprintln(period1.years)       \/\/ 1\nprintln(period1.months)      \/\/ 2\nprintln(period1.days)        \/\/ 0\nprintln(period1.hours)       \/\/ 1\nprintln(period1.minutes)     \/\/ 30\nprintln(period1.seconds)     \/\/ 0\nprintln(period1.nanoseconds) \/\/ 0\n<\/pre>\n\n\n\n<h2>Parsing f\u00fcr <code>Instant<\/code> aus einem String mit einem UTC-Offset<\/h2>\n\n\n\n<p>Die Klasse <code>Instant<\/code> repr\u00e4sentiert einen bestimmten Zeitpunkt. Die Bibliothek erm\u00f6glicht Parsing aus einem String mit Datums- und Zeitdarstellungen, die dem ISO 8601-Standard entsprechen.<\/p>\n\n\n\n<p>Vor 0.2.0 haben wir nur das Format mit der Zeitzonenbezeichnung <code>Z<\/code> am Ende akzeptiert, wie z.B. in <code>2021-01-02T03:02:01Z<\/code>, was bedeutet, dass die Zeit im UTC+0-Offset angegeben ist. Von nun an unterst\u00fctzen wir auch UTC-Offsets ungleich Null:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nval instant1 = Instant.parse(&quot;2021-01-02T03:02:01Z&quot;)\nval instant2 = Instant.parse(&quot;2021-01-02T06:02:01+03:00&quot;)\nprintln(instant1) \/\/ 2021-01-02T03:02:01Z\nprintln(instant2) \/\/ 2021-01-02T03:02:01Z\n<\/pre>\n\n\n\n<h2 id=\"give-it-a-try\">Probieren Sie es aus<\/h2>\n\n\n\n<p><code>kotlinx-datetime<\/code> 0.2.0 ist in der Maven Central verf\u00fcgbar. Um es in Ihrem Projekt auszuprobieren:<\/p>\n\n\n\n<ul><li>\u00dcberpr\u00fcfen Sie, ob Sie Maven Central als Repository eingestellt haben.<\/li><\/ul>\n\n\n\n<div style=\"margin-left:40px;\">\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nrepositories {\n    mavenCentral()\n}\n<\/pre>\n<\/div>\n\n\n\n<ul><li>F\u00fcgen Sie <code>kotlinx-datetime<\/code> als Abh\u00e4ngigkeit hinzu (vergessen Sie nicht, <a href=\"https:\/\/kotlinlang.org\/docs\/mobile\/add-dependencies.html\" target=\"_blank\" rel=\"noopener\">eine Quellengruppe<\/a> anzugeben, wenn Sie an einem Multiplattform-Projekt arbeiten).<\/li><\/ul>\n\n\n\n<div style=\"margin-left:40px;\">\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\ndependencies {\n    implementation(&quot;org.jetbrains.kotlinx:kotlinx-datetime:0.2.0&quot;)\n}\n<\/pre>\n<\/div>\n\n\n\n<p>Eine detaillierte Anleitung zur Bibliothek finden Sie in unserer <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-datetime#using-in-your-projects\" target=\"_blank\" rel=\"noopener\">README<\/a>.<\/p>\n\n\n\n<h2>Geben Sie uns Feedback<\/h2>\n\n\n\n<p>Die Bibliothek ist <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">experimentell<\/a>, und die API kann sich noch \u00e4ndern. Wir sind auf dem Weg zu einem stabilen Release und w\u00fcrden uns sehr \u00fcber Ihr Feedback freuen.<\/p>\n\n\n\n<p>Probieren Sie <code>kotlinx-datetime<\/code> 0.2.0 aus und teilen Sie uns Ihre Erfahrungen mit! Melden Sie alle Probleme, auf die Sie sto\u00dfen, im <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-datetime\/issues\" target=\"_blank\" rel=\"noopener\">Issue-Tracker<\/a> des Projekts und stellen Sie alle Fragen, die Sie haben, in unserem <a href=\"https:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack-Kanal<\/a> (Sie k\u00f6nnen <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">hier<\/a> eine Einladung erhalten).<\/p>\n","protected":false},"author":1132,"featured_media":141667,"comment_status":"closed","ping_status":"closed","template":"","categories":[909],"tags":[91],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/144979"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/1132"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=144979"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/144979\/revisions"}],"predecessor-version":[{"id":144985,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/144979\/revisions\/144985"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/141667"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=144979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=144979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=144979"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=144979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}