kotlin--JDateTime()应用

本文通过一个简单的Java示例说明了直接使用字符串进行日期运算的问题,并展示了如何错误地尝试修改日期对象的年月日来实现日期的加减。文章强调了正确的日期处理方式应避免直接操作字符串格式的日期。

!!比较日期不能用字符串!!


计算当前日期后推一个月

fun main(args: Array<String>) {

    val a = JDateTime("2018-01-31 00:00:00.000")

    println(a)

    a.year = a.year
    a.month = a.month - 1
    a.day = a.day + 1

    println(a)
}

输出结果:

2018-01-31 00:00:00.000
2018-01-01 00:00:00.000

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.io.path.ExperimentalPathApi found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.io.path.PathRelativizer found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.io.path.PathsKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.io.path.PathsKt__PathReadWriteKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.io.path.PathsKt__PathUtilsKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.jdk7.AutoCloseableKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk7-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0) Duplicate class kotlin.jvm.jdk8.JvmRepeatableKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.random.jdk8.PlatformThreadLocalRandom found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.streams.jdk8.StreamsKt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$1 found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$2 found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$3 found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$4 found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.text.jdk8.RegexExtensionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0) Duplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.6.0 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0)
最新发布
12-26
<think>我们遇到的问题是:在Android项目中,由于同时引入了不同版本的Kotlin标准库(如1.8.10和1.6.0),导致出现了重复类(例如CollectionsJDK8Kt)的编译错误。这是因为多个模块依赖了不同版本的kotlin-stdlib,而Gradle在打包时无法自动解决冲突,从而出现多个相同类。 解决方案的核心是统一Kotlin标准库的版本。以下是具体步骤: ### 步骤1: 检查项目中的Kotlin版本 在项目的根目录下的`build.gradle`文件中,检查Kotlin插件的版本: ```groovy buildscript { ext.kotlin_version = '1.8.10' // 确保这里是你想要使用的版本,比如1.8.10 dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } ``` ### 步骤2: 强制所有模块使用相同版本的Kotlin标准库 在app模块的`build.gradle`文件中,使用`resolutionStrategy`强制指定Kotlin标准库的版本: ```groovy android { // ... } configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } } dependencies { // 确保所有显式依赖的Kotlin库版本与上面一致 implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // ... 其他依赖 } ``` ### 步骤3: 排除传递依赖中冲突的版本 如果某个依赖项传递依赖了旧版本的Kotlin库,可以在依赖声明中排除: ```groovy dependencies { implementation('some-dependency') { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7' exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' } } ``` ### 步骤4: 使用Gradle的依赖树检查 在终端运行以下命令,查看依赖树,确认冲突是否解决: ```bash ./gradlew :app:dependencies --configuration releaseRuntimeClasspath ``` 或者对于调试版本: ```bash ./gradlew :app:dependencies --configuration debugRuntimeClasspath ``` ### 步骤5: 清理并重新构建 在Android Studio中,执行: - **Build > Clean Project** - **Build > Rebuild Project** ### 原理说明 Kotlin标准库分为多个模块: - `kotlin-stdlib`: 基础库,包含JDK6和JDK7的扩展 - `kotlin-stdlib-jdk7`: 包含JDK7的扩展 - `kotlin-stdlib-jdk8`: 包含JDK8的扩展 当项目中有多个模块分别依赖了不同版本的标准库时,Gradle默认会选择最高版本。但有时由于依赖传递的复杂性,可能会引入多个版本,导致重复类。通过强制指定版本,可以确保所有模块使用同一个版本。 ### 常见问题排查 1. **检查第三方库的更新**:有些第三方库可能已经更新并支持更高版本的Kotlin,尝试更新这些库。 2. **检查Gradle版本**:确保Gradle版本与Kotlin插件版本兼容。例如,Kotlin 1.8.10需要Gradle 7.0及以上版本。 3. **多模块项目**:如果项目包含多个模块,需要在每个模块中统一Kotlin版本,或者在根项目的`build.gradle`中使用`allprojects`块: ```groovy allprojects { configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // ... 其他 } } } ``` ### 替代方案:使用Kotlin BOM 如果项目使用Kotlin 1.8.0及以上版本,可以考虑使用Kotlin BOM(Bill of Materials)来统一版本: ```groovy dependencies { // 引入Kotlin BOM implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.10') // 然后添加其他Kotlin库时无需指定版本 implementation 'org.jetbrains.kotlin:kotlin-stdlib' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' } ``` BOM会管理所有Kotlin相关库的版本,确保它们一致。 ### 完整示例配置 **项目根目录 build.gradle**: ```groovy buildscript { ext.kotlin_version = '1.8.10' repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' // 或更高 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() mavenCentral() } // 统一所有项目的Kotlin版本 configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } } } ``` **app/build.gradle**: ```groovy apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { compileSdkVersion 34 defaultConfig { // ... } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // 其他依赖... } ``` 通过以上步骤,应该能解决重复类的问题。如果问题依旧,请检查是否有其他依赖强制指定了旧版本。 §§相关问题§§ 1. 如何在Android项目中统一Kotlin版本? 2. Gradle依赖冲突的常见解决方法有哪些? 3. 什么是Kotlin BOM,如何使用它管理依赖? </think> ## 解决 Kotlin 标准库版本冲突导致重复类编译错误 ### 问题原因分析 当 Android 项目中同时存在多个版本的 Kotlin 标准库依赖时(如 `kotlin-stdlib-1.8.10` 和 `kotlin-stdlib-jdk7/8-1.6.0`),会导致重复类错误。这是因为: 1. 不同模块依赖了不同版本的 Kotlin 库 2. Gradle 未正确统一版本 3. `kotlin-stdlib-jdk7/8` 与 `kotlin-stdlib` 存在重叠内容 --- ### 解决方案(逐步操作) #### 1. 统一 Kotlin 版本(关键步骤) 在项目根目录的 `build.gradle` 中强制指定统一版本: ```groovy // 项目根目录 build.gradle allprojects { configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:1.8.10" force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10" force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10" } } } ``` #### 2. 检查模块依赖声明 在 app 模块的 `build.gradle` 中: ```groovy dependencies { // 只声明一次标准库依赖 implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.10" // 检查其他依赖是否包含旧版本 implementation("com.example:some-library") { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' } } ``` #### 3. 清理构建缓存 在终端执行: ```bash ./gradlew cleanBuildCache ./gradlew :app:clean ``` #### 4. 验证依赖树 ```bash ./gradlew :app:dependencies --configuration releaseRuntimeClasspath ``` 检查输出中是否只有 **1.8.10** 版本的 Kotlin--- ### 依赖关系说明 Kotlin 标准库的模块关系: ``` kotlin-stdlib ├── kotlin-stdlib-common ├── kotlin-stdlib-jdk7 └── kotlin-stdlib-jdk8 ``` 当同时存在 **1.6.0** 和 **1.8.10** 版本时,会导致: - `CollectionsJDK8Kt.class` 重复定义 - `MutableCollectionsJVMKt.class` 冲突 --- ### 高级解决方案:使用 BOM 管理 如果项目支持 Kotlin BOM(Bill of Materials): ```groovy dependencies { // 引入 Kotlin BOM 统一版本 implementation platform("org.jetbrains.kotlin:kotlin-bom:1.8.10") // 无需指定版本 implementation "org.jetbrains.kotlin:kotlin-stdlib" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } ``` BOM 会自动管理所有 Kotlin 库的兼容版本[^1]。 --- ### 完整配置示例 **项目根目录 build.gradle**: ```groovy buildscript { ext.kotlin_version = '1.8.10' dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { configurations.all { resolutionStrategy.force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" resolutionStrategy.force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" resolutionStrategy.force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } } ``` **app/build.gradle**: ```groovy dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10" // 其他依赖... } ``` > **注意**:升级后需同步 Gradle(Android Studio 右上角 "Sync Project with Gradle Files" 按钮) --- ### 验证是否解决 检查构建日志中是否消除以下错误: ``` Duplicate class kotlin.collections.CollectionsJDK8Kt found in modules... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值