Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  display.rs

  Sprache: Rust
 

use std::fmt::{self, Write};

use super::{TmFmt, Tm, Fmt};

impl<'a> fmt::Display for TmFmt<'a> {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        match self.format {
            Fmt::Str(ref s) => {
                let mut chars = s.chars();
                while let Some(ch) = chars.next() {
                    if ch == '%' {
                        // we've already validated that % always precedes
                        // another char
                        parse_type(fmt, chars.next().unwrap(), self.tm)?;
                    } else {
                        fmt.write_char(ch)?;
                    }
                }

                Ok(())
            }
            Fmt::Ctime => self.tm.to_local().asctime().fmt(fmt),
            Fmt::Rfc3339 => {
                if self.tm.tm_utcoff == 0 {
                    TmFmt {
                        tm: self.tm,
                        format: Fmt::Str("%Y-%m-%dT%H:%M:%SZ"),
                    }.fmt(fmt)
                } else {
                    let s = TmFmt {
                        tm: self.tm,
                        format: Fmt::Str("%Y-%m-%dT%H:%M:%S"),
                    };
                    let sign = if self.tm.tm_utcoff > 0 { '+' } else { '-' };
                    let mut m = abs(self.tm.tm_utcoff) / 60;
                    let h = m / 60;
                    m -= h * 60;
                    write!(fmt, "{}{}{:02}:{:02}", s, sign, h, m)
                }
            }
        }
    }
}

fn is_leap_year(year: i32) -> bool {
    (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))
}

fn days_in_year(year: i32) -> i32 {
    if is_leap_year(year) { 366 }
    else                  { 365 }
}

fn iso_week_days(yday: i32, wday: i32) -> i32 {
    /* The number of days from the first day of the first ISO week of this
    * year to the year day YDAY with week day WDAY.
    * ISO weeks start on Monday. The first ISO week has the year's first
    * Thursday.
    * YDAY may be as small as yday_minimum.
    */

    let iso_week_start_wday: i32 = 1;                     /* Monday */
    let iso_week1_wday: i32 = 4;                          /* Thursday */
    let yday_minimum: i32 = 366;
    /* Add enough to the first operand of % to make it nonnegative. */
    let big_enough_multiple_of_7: i32 = (yday_minimum / 7 + 2) * 7;

    yday - (yday - wday + iso_week1_wday + big_enough_multiple_of_7) % 7
        + iso_week1_wday - iso_week_start_wday
}

fn iso_week(fmt: &mut fmt::Formatter, ch:char, tm: &Tm) -> fmt::Result {
    let mut year = tm.tm_year + 1900;
    let mut days = iso_week_days(tm.tm_yday, tm.tm_wday);

    if days < 0 {
        /* This ISO week belongs to the previous year. */
        year -= 1;
        days = iso_week_days(tm.tm_yday + (days_in_year(year)), tm.tm_wday);
    } else {
        let d = iso_week_days(tm.tm_yday - (days_in_year(year)),
                              tm.tm_wday);
        if 0 <= d {
            /* This ISO week belongs to the next year. */
            year += 1;
            days = d;
        }
    }

    match ch {
        'G' => write!(fmt, "{}", year),
        'g' => write!(fmt, "{:02}", (year % 100 + 100) % 100),
        'V' => write!(fmt, "{:02}", days / 7 + 1),
        _ => Ok(())
    }
}

fn parse_type(fmt: &mut fmt::Formatter, ch: char, tm: &Tm) -> fmt::Result {
    match ch {
        'A' => fmt.write_str(match tm.tm_wday {
            0 => "Sunday",
            1 => "Monday",
            2 => "Tuesday",
            3 => "Wednesday",
            4 => "Thursday",
            5 => "Friday",
            6 => "Saturday",
            _ => unreachable!(),
        }),
        'a' => fmt.write_str(match tm.tm_wday {
            0 => "Sun",
            1 => "Mon",
            2 => "Tue",
            3 => "Wed",
            4 => "Thu",
            5 => "Fri",
            6 => "Sat",
            _ => unreachable!(),
        }),
        'B' => fmt.write_str(match tm.tm_mon {
            0 => "January",
            1 => "February",
            2 => "March",
            3 => "April",
            4 => "May",
            5 => "June",
            6 => "July",
            7 => "August",
            8 => "September",
            9 => "October",
            10 => "November",
            11 => "December",
            _ => unreachable!(),
        }),
        'b' | 'h' => fmt.write_str(match tm.tm_mon {
            0 => "Jan",
            1 => "Feb",
            2 => "Mar",
            3 => "Apr",
            4 => "May",
            5 => "Jun",
            6 => "Jul",
            7 => "Aug",
            8 => "Sep",
            9 => "Oct",
            10 => "Nov",
            11 => "Dec",
            _  => unreachable!(),
        }),
        'C' => write!(fmt, "{:02}", (tm.tm_year + 1900) / 100),
        'c' => {
            parse_type(fmt, 'a', tm)?;
            fmt.write_str(" ")?;
            parse_type(fmt, 'b', tm)?;
            fmt.write_str(" ")?;
            parse_type(fmt, 'e', tm)?;
            fmt.write_str(" ")?;
            parse_type(fmt, 'T', tm)?;
            fmt.write_str(" ")?;
            parse_type(fmt, 'Y', tm)
        }
        'D' | 'x' => {
            parse_type(fmt, 'm', tm)?;
            fmt.write_str("/")?;
            parse_type(fmt, 'd', tm)?;
            fmt.write_str("/")?;
            parse_type(fmt, 'y', tm)
        }
        'd' => write!(fmt, "{:02}", tm.tm_mday),
        'e' => write!(fmt, "{:2}", tm.tm_mday),
        'f' => write!(fmt, "{:09}", tm.tm_nsec),
        'F' => {
            parse_type(fmt, 'Y', tm)?;
            fmt.write_str("-")?;
            parse_type(fmt, 'm', tm)?;
            fmt.write_str("-")?;
            parse_type(fmt, 'd', tm)
        }
        'G' => iso_week(fmt, 'G', tm),
        'g' => iso_week(fmt, 'g', tm),
        'H' => write!(fmt, "{:02}", tm.tm_hour),
        'I' => {
            let mut h = tm.tm_hour;
            if h == 0 { h = 12 }
            if h > 12 { h -= 12 }
            write!(fmt, "{:02}", h)
        }
        'j' => write!(fmt, "{:03}", tm.tm_yday + 1),
        'k' => write!(fmt, "{:2}", tm.tm_hour),
        'l' => {
            let mut h = tm.tm_hour;
            if h == 0 { h = 12 }
            if h > 12 { h -= 12 }
            write!(fmt, "{:2}", h)
        }
        'M' => write!(fmt, "{:02}", tm.tm_min),
        'm' => write!(fmt, "{:02}", tm.tm_mon + 1),
        'n' => fmt.write_str("\n"),
        'P' => fmt.write_str(if tm.tm_hour < 12 { "am" } else { "pm" }),
        'p' => fmt.write_str(if (tm.tm_hour) < 12 { "AM" } else { "PM" }),
        'R' => {
            parse_type(fmt, 'H', tm)?;
            fmt.write_str(":")?;
            parse_type(fmt, 'M', tm)
        }
        'r' => {
            parse_type(fmt, 'I', tm)?;
            fmt.write_str(":")?;
            parse_type(fmt, 'M', tm)?;
            fmt.write_str(":")?;
            parse_type(fmt, 'S', tm)?;
            fmt.write_str(" ")?;
            parse_type(fmt, 'p', tm)
        }
        'S' => write!(fmt, "{:02}", tm.tm_sec),
        's' => write!(fmt, "{}", tm.to_timespec().sec),
        'T' | 'X' => {
            parse_type(fmt, 'H', tm)?;
            fmt.write_str(":")?;
            parse_type(fmt, 'M', tm)?;
            fmt.write_str(":")?;
            parse_type(fmt, 'S', tm)
        }
        't' => fmt.write_str("\t"),
        'U' => write!(fmt, "{:02}", (tm.tm_yday - tm.tm_wday + 7) / 7),
        'u' => {
            let i = tm.tm_wday;
            write!(fmt, "{}", (if i == 0 { 7 } else { i }))
        }
        'V' => iso_week(fmt, 'V', tm),
        'v' => {
            parse_type(fmt, 'e', tm)?;
            fmt.write_str("-")?;
            parse_type(fmt, 'b', tm)?;
            fmt.write_str("-")?;
            parse_type(fmt, 'Y', tm)
        }
        'W' => {
            write!(fmt, "{:02}", (tm.tm_yday - (tm.tm_wday - 1 + 7) % 7 + 7) / 7)
        }
        'w' => write!(fmt, "{}", tm.tm_wday),
        'Y' => write!(fmt, "{}", tm.tm_year + 1900),
        'y' => write!(fmt, "{:02}", (tm.tm_year + 1900) % 100),
        // FIXME (#2350): support locale
        'Z' => fmt.write_str(if tm.tm_utcoff == 0 { "UTC"else { "" }),
        'z' => {
            let sign = if tm.tm_utcoff > 0 { '+' } else { '-' };
            let mut m = abs(tm.tm_utcoff) / 60;
            let h = m / 60;
            m -= h * 60;
            write!(fmt, "{}{:02}{:02}", sign, h, m)
        }
        '+' => write!(fmt, "{}", tm.rfc3339()),
        '%' => fmt.write_str("%"),
        _   => unreachable!(),
    }
}

fn abs(i: i32) -> i32 {
    if i < 0 {-i} else {i}
}

Messung V0.5 in Prozent
C=90 H=96 G=93

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet am  2026-06-22) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik