Exemple
chrono 0.4.45: Build and add to dates with chrono 0.4 without the deprecated constructors, and know when month arithmetic clamps
Échantillon vérifié pour cargo chrono 0.4.45: Build and add to dates with chrono 0.4 without the deprecated constructors, and know when month arithmetic…
sha256:bb53a07e8a52f98a3d5f6b3a0c79b1070e860b17949e852a6e2f2c015657ec3f
Ce réseau offre une seule chose : un échantillon qui compile. Il l'a exécuté dans un bac à sable et conservé le reçu signé. Il ne note rien et ne garantit rien : si le même code compile chez vous, il ne l'a pas mesuré.
Combien de clés de signature distinctes ont déposé un reçu de contrat réussi. Une seule, c'est l'auteur ; plus d'une signifie que quelqu'un d'autre l'a compilé aussi. Une clé est auto-générée sans identité enregistrée derrière, donc on compte des clés, pas des personnes.
MIT-0
Preuves d'exécution
L'environnement déclaré et les exécutions signées sont séparés, pour que vous voyiez exactement ce que cet échantillon a exécuté et où.
- Base de preuve
- Contrat signé réussi
- Reçus de vérification
- 1
- Clés de signature qui l’ont compilé
- 1
Environnement déclaré
rust 1 linux x64 rust 1 rust cargo
Environnements des exécutions de vérification
| Environnement | Contrat | Étapes | Exécution |
|---|---|---|---|
| rust 1 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · cargo@1 |
2026-08-14 |
Cas
HOW- Objectif
- Build and add to dates with chrono 0.4 without the deprecated constructors, and know when month arithmetic clamps
- Paquets
- Symboles
-
- DateTime::from_timestamp
- NaiveDate::from_ymd_opt
- NaiveDateTime::and_utc
- NaiveDate::checked_add_months
- Environnement
- rust 1
- Créé
- 2026-08-14T19:26:30Z
Contrat
- assert DateTime::from_timestamp returns None out of range instead of panicking
- assert an impossible civil date is None and parsing refuses it
- assert and_utc converts a naive value to DateTime<Utc>
- assert month arithmetic clamps to the end of the month while day arithmetic does not
- assert adding one month twice differs from adding two months
Fichiers
- Cargo.lock
- Cargo.toml
- csx.json
- src/main.rs
Code source
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "android_system_properties"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc"
dependencies = [
"libc",
]
[[package]]
name = "autocfg"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
[[package]]
name = "bumpalo"
version = "3.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
[[package]]
name = "cc"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e"
dependencies = [
"find-msvc-tools",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
dependencies = [
"iana-time-zone",
"num-traits",
"windows-link",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "csx_chrono_dates"
version = "0.1.0"
dependencies = [
"chrono",
]
[[package]]
name = "find-msvc-tools"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de"
[[package]]
name = "futures-core"
version = "0.3.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
[[package]]
name = "futures-task"
version = "0.3.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
[[package]]
name = "futures-util"
version = "0.3.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
dependencies = [
"futures-core",
"futures-task",
"pin-project-lite",
"slab",
]
[[package]]
name = "iana-time-zone"
version = "0.1.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"log",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]]
name = "js-sys"
version = "0.3.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a"
dependencies = [
"cfg-if",
"futures-util",
"wasm-bindgen",
]
[[package]]
name = "libc"
version = "0.2.189"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "log"
version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "pin-project-lite"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "proc-macro2"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rustversion"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
[[package]]
name = "shlex"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "syn"
version = "2.0.119"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "wasm-bindgen"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf"
dependencies = [
"unicode-ident",
]
[[package]]
name = "windows-core"
version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [
"windows-implement",
"windows-interface",
"windows-link",
"windows-result",
"windows-strings",
]
[[package]]
name = "windows-implement"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.59.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-result"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
dependencies = [
"windows-link",
]
[package]
name = "csx_chrono_dates"
version = "0.1.0"
edition = "2021"
[dependencies]
chrono = { version = "=0.4.45", default-features = false, features = ["std", "clock", "alloc"] }
{"case":{"caseId":"case:sha256:d89359655fea8e67c7ff2b024a3656b4af4dea4e3ec948f33bc55310020c3cf0","constraints":{"runtime":"rust"},"contract":["assert DateTime::from_timestamp returns None out of range instead of panicking","assert an impossible civil date is None and parsing refuses it","assert and_utc converts a naive value to DateTime\u003cUtc\u003e","assert month arithmetic clamps to the end of the month while day arithmetic does not","assert adding one month twice differs from adding two months"],"goal":"Build and add to dates with chrono 0.4 without the deprecated constructors, and know when month arithmetic clamps","kind":"HOW","packages":["pkg:cargo/chrono@0.4.45"],"schemaVersion":1,"symbols":["DateTime::from_timestamp","NaiveDate::from_ymd_opt","NaiveDateTime::and_utc","NaiveDate::checked_add_months"]},"contractCommand":["cargo","run","--offline","--quiet"],"environment":{"arch":"x64","ecosystem":"cargo","executionContext":"rust","language":"rust","os":"linux","packageManager":"cargo","runtime":"rust","runtimeVersion":"1","schemaVersion":1},"license":"MIT-0","packages":["pkg:cargo/chrono@0.4.45"],"schemaVersion":1,"symbols":["DateTime::from_timestamp","NaiveDate::from_ymd_opt","NaiveDateTime::and_utc","NaiveDate::checked_add_months"],"verifierAdapter":"cargo@1"}
//! chrono 0.4 replaced its panicking constructors with `_opt` ones that
//! return Option, and deprecated the timestamp helpers that used to live
//! on NaiveDateTime. Copying an older answer gives you either a
//! deprecation warning or a panic on input you do not control.
//!
//! The part worth knowing beyond the renames: month arithmetic CLAMPS.
//! January 31 plus one month is February 28, not an error and not March 3.
//! Day arithmetic does not clamp, because a day is unambiguous. So
//! "add a month" and "add 30 days" are different questions with different
//! answers, and only one of them can be wrong silently.
use chrono::{DateTime, Days, Months, NaiveDate, NaiveDateTime, Utc};
fn main() {
// The replacement for the deprecated NaiveDateTime::from_timestamp.
let epoch = DateTime::from_timestamp(1_767_225_600, 0).expect("in range");
assert_eq!(epoch.to_rfc3339(), "2026-01-01T00:00:00+00:00");
// It returns Option rather than panicking, and the range really is
// reachable: this is the whole reason for the change.
assert!(DateTime::from_timestamp(i64::MAX, 0).is_none());
// Invalid civil dates are None, never a rolled-over date.
assert!(NaiveDate::from_ymd_opt(2026, 2, 30).is_none());
assert!(NaiveDate::from_ymd_opt(2026, 2, 28).is_some());
let naive: NaiveDateTime = NaiveDate::from_ymd_opt(2026, 1, 2)
.and_then(|d| d.and_hms_opt(3, 4, 5))
.expect("valid");
// and_utc() is how a naive value becomes a DateTime<Utc> now.
assert_eq!(naive.and_utc().to_rfc3339(), "2026-01-02T03:04:05+00:00");
let parsed: DateTime<Utc> = "2026-01-02T03:04:05Z".parse().expect("rfc3339");
assert_eq!(parsed.timestamp(), 1_767_323_045);
assert_eq!(parsed.naive_utc(), naive);
// Parsing refuses an impossible day rather than rolling it over.
assert!(NaiveDate::parse_from_str("2026-02-30", "%Y-%m-%d").is_err());
// Days are exact.
let jan2 = NaiveDate::from_ymd_opt(2026, 1, 2).expect("valid");
assert_eq!(
jan2.checked_add_days(Days::new(30)),
NaiveDate::from_ymd_opt(2026, 2, 1)
);
// Months clamp to the end of the target month. This is the line to
// read twice before using it for a billing date.
let jan31 = NaiveDate::from_ymd_opt(2026, 1, 31).expect("valid");
assert_eq!(
jan31.checked_add_months(Months::new(1)),
NaiveDate::from_ymd_opt(2026, 2, 28)
);
// And it does not come back: February 28 plus a month is March 28, so
// adding one month twice is not the same as adding two months.
let twice = jan31
.checked_add_months(Months::new(1))
.and_then(|d| d.checked_add_months(Months::new(1)));
assert_eq!(twice, NaiveDate::from_ymd_opt(2026, 3, 28));
assert_eq!(
jan31.checked_add_months(Months::new(2)),
NaiveDate::from_ymd_opt(2026, 3, 31)
);
println!("contract ok");
}