- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 chrono::format::strftime
的静态数组我的应用程序支持的格式。我想避免在运行时解析它们,所以我定义了一个 lazy_static!
将它们解析为 chrono::format::Item
集合的 block .
但是,当我尝试遍历已解析的集合时,出现错误:
the trait bound `&chrono::format::StrftimeItems<'_>: std::iter::Iterator` is not satisfied
这是一个简短的复制:
#[macro_use]
extern crate lazy_static;
extern crate chrono;
use chrono::DateTime;
use chrono::offset::FixedOffset;
use chrono::format::{Parsed, parse};
use chrono::format::strftime::StrftimeItems;
static FORMATS : &[&'static str] = &["%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S%.f"];
lazy_static! {
static ref PARSED_FORMATS : Vec<StrftimeItems<'static>> = FORMATS
.iter()
.map(|format| StrftimeItems::new(format))
.collect();
}
fn parse_datetime(s: &str) -> Option<DateTime<FixedOffset>> {
for format in PARSED_FORMATS.iter() {
let mut parsed = Parsed::new();
let dt = parse(&mut parsed, &s, format)
.and_then(|_| parsed.to_datetime() );
if dt.is_ok() {
return dt.ok()
}
}
return None
}
正在尝试取消引用 format
在循环中给出了这个错误:
error[E0507]: cannot move out of borrowed content
--> src\main.rs:21:35
|
21 | let dt = parse(&mut parsed, &s, *format)
| ^^^^^^^ cannot move out of borrowed content
error: aborting due to previous error
正在尝试克隆 format
似乎可行,但克隆在这里似乎是多余的,我想避免它。
这是正确的方法吗?或者使用宏可能是更好的选择?
最佳答案
StrftimeItems
是迭代器,而不是可迭代容器(如 Vec
是)。当你推进一个迭代器时,你不能倒带它。 parse
必须按值接收迭代器,这意味着您必须采用 StrftimeItems
我们的向量(这意味着您以后不能重复使用它)或克隆 StrftimeItems
存储在向量中。通过克隆 StrftimeItems
,您可以生成一个新的迭代器,其状态与原始迭代器不同(即推进一个不会推进另一个)。
I'd like to avoid parsing them during run time
然而,StrftimeItems
不会让你实现你的目标,因为 StrftimeItems
lazily parses the format string as the iterator advances .
相反,我建议您将该迭代器的结果收集到 Vec<Item<'static>>
中。 .
#[macro_use]
extern crate lazy_static;
extern crate chrono;
use chrono::DateTime;
use chrono::offset::FixedOffset;
use chrono::format::{Item, Parsed, parse};
use chrono::format::strftime::StrftimeItems;
static FORMATS : &[&'static str] = &["%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%S%.f"];
lazy_static! {
static ref PARSED_FORMATS : Vec<Vec<Item<'static>>> = FORMATS
.iter()
.map(|format| StrftimeItems::new(format).collect())
.collect();
}
fn parse_datetime(s: &str) -> Option<DateTime<FixedOffset>> {
for format in PARSED_FORMATS.iter() {
let mut parsed = Parsed::new();
let dt = parse(&mut parsed, &s, format.iter().cloned())
.and_then(|_| parsed.to_datetime() );
if dt.is_ok() {
return dt.ok()
}
}
return None
}
现在,当我们调用 parse
, 我们通过 format.iter().cloned()
. format
是 Vec<Item<'static>>
, iter()
在对 Item
的引用上生成一个新的迭代器s 和 cloned()
调整迭代器,使每个 Item
按值返回(通过克隆它们实现)而不是按引用返回(因为 parse
期望迭代器超过 Item
值,而不是 Item
引用)。
关于rust - 如何将 `chrono::format::strftime` 静态转换为 `chrono::format::Item`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975507/
“strftime”中的“strf”是什么意思?我在谷歌上搜索了很多次这个问题,但没有找到答案。知道这些字母代表什么会让我更容易记住这个函数的名称。 最佳答案 来自 man 3 strftime :
我制作了这个脚本来跟踪我当前的时间和当前的电池百分比(然后将其附加到剪贴板,以便我可以将其粘贴到某个地方): from tkinter import * from urllib import pars
我想从我的 Sqlite 数据库中的日期时间列中获取一个月中的某一天。我可以简单地使用 select strftime('%d',myColumn) from myTable 但是这些值以 UTC 格
我编写了一个 perl 脚本,我在其中调用一个子例程将字段插入到数据库表中。该子例程在除主 perl 文件 Test.pl 之外的另一个文件 Test.pm 中调用。在 Test.pm 中,我将以下字
我们有一个 C++/MFC 应用程序,它允许用户通过配置文件自定义日期格式。不想重新发明轮子,我将格式字符串传递给 CTime::Format("") 以进行实际格式化。在幕后,Format 调用了标
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我使用strftime获得ISO 8601格式(%V)的星期数,并希望转换为前景中显示的星期数(猜测是格里高利历法)。 Outlook日历设置为: 一周的第一天(星期日) 一年的第一周1月1日开始 在
为什么此页面的代码不起作用?:http://strftime.org/ 。我想输出不带前导零的日期和月份,例如 'm/d/yyyy' 例如:“1992 年 4 月 5 日”是 '04/05/1992'
谁能告诉我为什么时区返回为“山区夏令时间”而不是 MST ? import time print time.strftime( "%H:%M %A %Z %d %b %y") 最佳答案 根据您提出的另
我正在尝试更新一些 csv 文件,稍后再更新我的数据库。看来每个月的 strftime 都会混淆一天。我在德国,我们写的是日期 DD/MM/YYYY 而不是 MM/DD/YYYY。 如何从 germa
我当前的计算机显示 CET 时间: $ date Mon Dec 1 21:31:41 CET 2014 但是我的区域设置是 en_US: $ locale | grep -i time LC_TI
strftime('%s', 'now', 'start of month') AND strftime('%s', 'now', 'start of month', '+1 month', '-1
我正在使用以下日期格式: d.strftime("%A, %d %B %Y %H:%m") 并且由于工作日的长度 (%A) 发生了变化,我想总是打印工作日10个字符,左边补空格,右对齐。 有点像 d.
Python3 strftime 产生的结果因平台而异。例如: OS X 10.10.5 >>> sys.version '3.5.2 (v3.5.2:4def2a2901a5, Jun 26 201
大家好,我想知道是否有人可以向我指出这一点。我目前正在尝试在 cmd 提示符的右上角显示日期和时间,但我得到的字符比我要求的要多。这是我目前所拥有的 time_t rawtime; struct tm
#include #include using namespace std; int main() { char dateStringBuffer[256] = ""; tm da
我试过 strftime( ) 来获取格式化的时间戳。 char ft[ 256 ]; struct tm *tmp; strftime( ft, 256, "%D - %T", tmp ); 我的问
char buffer[800]; struct tm str_time; str_time.tm_mday = Cur_Day; str_time.t
例如,时间戳是1403667010.574,使用Time.at(1403667010.574).strftime('%Y-%m-%d %H:%M:%S.%L %z'),则结果为 "2014-06-25
我试图将 YYYY-mm-dd 23:59:59 格式的时间保存到带有日期时间的 mysql 数据库列中。我不明白为什么总是忽略分钟和秒 00 ?非常感谢您的帮助。 PHP: $time = strf
我是一名优秀的程序员,十分优秀!