NA 清洁时间计算引擎

简介

这是一个用于确定 NA 清洁时间里程碑的计算“引擎”。它允许实施者确定 NA 康复终身努力过程中的重要里程碑。

它是一个原生的 Swift “无界面”引擎模块,旨在编译并链接到 Apple 应用程序中;无论平台如何。

代码文档

详细的 API 文档可在此处获得。

它解决了什么问题?

NA 清洁时间有一系列“具有文化意义”的里程碑,当成员保持戒除并实践 NA 计划时,这些里程碑会被认可。这些里程碑是:

此模块将接受两个日期(“清洁日期”,即开始保持清洁的第一天,以及“结束”日期 - 通常是今天),并将计算这两个日期之间的所有里程碑。

然后,它将报告这些里程碑,其方式不会规定呈现的格式,但允许呈现者确定准确的报告 UI。

这不适用于早于 1950 年 1 月 1 日的开始日期。由于 NA 始于 1953 年(就我们的目的而言),这没问题。

该算法是非包容性的。它不计算初始日。如果开始日期和结束日期相同,则经过了零天。

该算法的粒度是完整的天数。开始时间和结束时间假定为中午。

这使用 公历

实施

这是一个 Apple 库,用原生 Swift 编写。它不是为 Objective-C 项目设计的。

这适用于 iOSiPadOSMacOSWatchOStvOS

它仅依赖于 Swift Foundation Library。它专为 Swift 5.0 或更高版本设计。

安装

Swift Package Manager

推荐的实施方式是通过 Swift Package Manager。 此项目的 Git URI 是

git@github.com:LittleGreenViper/LGV_Cleantime.git

包含该项目后,您可以使用以下 import 语句导入它

import LGV_Cleantime

GitHub Carthage

您可以通过将以下行添加到您的 CartFile 中来将此项目添加到您的项目中

github "LittleGreenViper/LGV_Cleantime"

导入模块后,您可以构建库并导入模块(如上所述),也可以通过进入 Carthage/Checkouts/LGV_Cleantime/Sources/LGV_Cleantime 目录并将其中的两个文件添加到您的项目中,直接将文件添加到您的项目中。 请注意,如果您这样做,则不要 import 该模块。

直接从 GitHub

您还可以通过引用其 Git URL,将该模块作为 Git 子模块包含在内

git@github.com:LittleGreenViper/LGV_Cleantime.git

用法

安装并导入模块后,您可以非常简单地使用它。

// This is a simple utility function for creating dates from the Gregorian calendar.
func makeDate(year inYear: Int, month inMonth: Int, day inDay: Int) -> Date { Calendar(identifier: .gregorian).date(from: DateComponents(year: inYear, month: inMonth, day: inDay)) ?? Date() }

// We make a couple of dates (the date range).
let startDate = makeDate(year: 1953, month: 10, day: 5)
let endDate = makeDate(year: 2021, month: 7, day: 17)

这将根据给定的两个日期创建引擎的实例

let calculator = LGV_CleantimeDateCalc(startDate: startDate, endDate: endDate)

这将根据给定的两个日期(以公历表示)创建引擎的实例,但指定波斯(伊朗)阳历作为计算引擎

let calculator = LGV_CleantimeDateCalc(startDate: startDate, endDate: endDate, calendar: Calendar(identifier: .persian))

您可以“混合搭配”日历。 这组测试使用波斯日历进行了此操作。

这是两个日期之间经过的完整天数

let totalDays = calculator.cleanTime.totalDays

这是两个日期之间经过的完整月数

let totalMonths = calculator.cleanTime.totalMonths

这是两个日期之间经过的完整年数

let years = calculator.cleanTime.years

这是自上一个完整年度以来经过的完整月数

let months = calculator.cleanTime.months

这是自上一个完整年度之后,自上个月以来经过的完整天数

let days = calculator.cleanTime.days

您还可以使用直接实例化的内联结构,如下所示

let totalDays = LGV_CleantimeDateCalc(startDate: startDate, endDate: makeDate(year: 2021, month: 7, day: 16)).cleanTime.totalDays
let totalMonths = LGV_CleantimeDateCalc(startDate: startDate, endDate: Date()).cleanTime.totalMonths

请注意,您不必指定结束日期。 如果您省略了该日期,则假定为“今天”

let years = LGV_CleantimeDateCalc(startDate: startDate).cleanTime.years
let months = LGV_CleantimeDateCalc(startDate: startDate).cleanTime.months
let days = LGV_CleantimeDateCalc(startDate: startDate).cleanTime.months

LGV_CleantimeDateCalc.cleanTime 是主力。 这将返回一个包含计算结果的结构。 它具有许多访问器,如果时间跨度内存在里程碑,则返回 true

LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isOneDayOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isThirtyDaysOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isSixtyDaysOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isNinetyDaysOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isSixMonthsOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isNineMonthsOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isOneYearOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isEighteenMonthsOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isTwoOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isFiveOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isTenOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isFifteenOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isTwentyOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isTwentyFiveOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isTenThousandDaysOrMore
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isThirtyOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isFortyOrMoreYears
LGV_CleantimeDateCalc(startDate: startDate).cleanTime.isFiftyOrMoreYears

您还可以直接从实例中获取一些 Date 结构

let components = LGV_CleantimeDateCalc(startDate: startDate).components
let timeInterval = LGV_CleantimeDateCalc(startDate: startDate).timeInterval

这些将返回直接用于日期实用程序的值。

最后,您可以根据日期获取“里程碑”,使用这些计算属性

LGV_CleantimeDateCalc(startDate: startDate).lastCleantimeMilestone LGV_CleantimeDateCalc(startDate: startDate).dateOfLastCleantimeMilestone LGV_CleantimeDateCalc(startDate: startDate).dateOfLastAnnualMilestone

以及此方法

LGV_CleantimeDateCalc(startDate: startDate).dateOfThisCleantimeMilestone(_: CleanTimeEvent) -> Date?

第一个返回一个枚举,其中包含日期范围内的最后一个“里程碑”,第二个返回发生该里程碑的实际日期。

GitHub 项目

此库的 GitHub 项目是 https://github.com/LittleGreenViper/LGV_Cleantime

许可证

MIT 许可证

特此授予任何获得本软件和相关文档文件(“软件”)副本的人员免费许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件的副本,并允许向为其提供本软件的人员提供本软件,但须符合以下条件

上述版权声明和本许可声明应包含在所有副本或本软件的重要部分中。

本软件按“原样”提供,不作任何形式的明示或暗示保证,包括但不限于适销性、特定用途的适用性和非侵权性的保证。 在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,由软件引起、与之相关或由软件的使用或其他处理引起。

不隶属于 NA WORLD SERVICES, INC. (NAWS)

这是一个由单个工程师发布的独立项目,并且声明与 NAWS 或任何 NA 服务机构或小组没有任何隶属关系。