我正在使用卢克松进行日期计算,并试图得到一个月的月底在德国时区。我尝试了以下代码,但它给了我'2022-08-30T23:59:59.999+02:00‘。但八月份有31天。
DateTime.fromISO('2022-07-31T10:00:00')
.setZone("Europe/Berlin")
.plus({month: 1})
.endOf('month')
.toString() // '2022-08-30T23:59:59.999+02:00'(https://codesandbox.io/s/luxon-playground-forked-srh81m)
我遗漏了什么?
发布于 2022-08-01 07:21:51
我认为这个问题显示在链接CodeSandbox是由于旧版本的鲁迅使用(1.2.0)。
您将使用版本>= 1.21.2获得预期的结果,请参阅变化量g
1.21.2 (2019-11-18)
工作实例:
const DateTime = luxon.DateTime;
console.log(
DateTime.fromISO('2022-07-31T10:00:00')
.setZone("Europe/Berlin")
.plus({month: 1})
.endOf('month')
.toString()
);<script src="https://cdn.jsdelivr.net/npm/luxon@1.21.2/build/global/luxon.min.js"></script>
发布于 2022-08-01 02:23:13
在回答你的问题之前,快速观察一下: 您共享的CodeSandbox链接中的代码似乎与你的问题中的细节无关,下面我将回答您问题的细节(而不是外部链接中的内容):
让我们看看方法链中每个函数返回的内容:
DateTime.fromISO -从ISO8601字符串创建一个DateTimeDateTime.prototype.setZone -“将”日期时间的区域设置为指定的区域。返回一个新构造的DateTime。DateTime.prototype.plus -向此DateTime添加一段时间并返回结果的DateTimeDateTime.prototype.endOf --将这个DateTime设置为一个时间单位的末尾(意思是最后毫秒)DateTime.prototype.toString -返回适合调试的此DateTime的字符串表示形式。请记住,所有的鲁迅对象都是不可变的。。所有这些都不会发生任何变化:它们都返回新的DateTime实例。
fromISO方法接受一个options对象作为第二个参数,该对象具有一个可选的zone属性,默认情况下该属性设置为"local"。如果您在从ISO字符串创建DateTime时没有提供此选项(与示例中的示例一样,该字符串不包括时区信息),则初始DateTime实例将配置为代码的JS运行时环境的时区(通常由主机操作系统设置),字符串中的日期和时间信息将被解释为就在该时区。
因此,如果您提供一个没有区域信息的ISO字符串(但您希望使用特定的区域),则应该在实例化时提供该选项,如下所示:
const dateStr = '2022-07-31T10:00:00';
const zone = 'Europe/Berlin';
const dt = DateTime.fromISO(dateStr, {zone});以这种方式设置区域将在调试字符串中产生预期的转换结果:
<script type="module">
import {DateTime} from 'https://unpkg.com/luxon@3.0.1/build/es6/luxon.js';
const dateStr = '2022-07-31T10:00:00';
const zone = 'Europe/Berlin';
const resultStr = DateTime.fromISO(dateStr, {zone})
.plus({month: 1})
.endOf('month')
.toString();
console.log({resultStr}); // { resultStr: "2022-08-31T23:59:59.999+02:00" }
</script>
最后--虽然与您的问题- since没有直接关系,但您似乎是在与鲁迅转换日期,请记住,它有两个转换精度模式:“随意”和“长期”。
https://stackoverflow.com/questions/73187118
复制相似问题