আমি কীভাবে স্ট্রিং করতে পারি। NET এ কাস্টম ফর্ম্যাট সহ টাইমস্প্যান অবজেক্টটি ফর্ম্যাট করতে পারি?


184

TimeSpanকাস্টম ফর্ম্যাট সহ স্ট্রিংয়ে অবজেক্টগুলিকে ফর্ম্যাট করার প্রস্তাবিত উপায় কী ?

উত্তর:


246

দয়া করে নোট করুন: এই উত্তরটি। নেট 4.0 এবং তারপরের জন্য। আপনি নেট। 3.5 বা নীচে একটি টাইমস্প্যান ফর্ম্যাট করতে চান দয়া করে জোহানেসএইচ এর উত্তর দেখুন

নেট নেট Time.০ এ কাস্টম টাইমস্প্যান ফর্ম্যাট স্ট্রিংগুলি চালু করা হয়েছিল। আপনি এমএসডিএন কাস্টম টাইমস্প্যান ফর্ম্যাট স্ট্রিং পৃষ্ঠায় উপলভ্য ফর্ম্যাট স্পেসিফায়ারের পুরো রেফারেন্সটি পেতে পারেন ।

এখানে টাইমস্প্যান ফর্ম্যাট স্ট্রিংয়ের একটি উদাহরণ রয়েছে:

string.Format("{0:hh\\:mm\\:ss}", myTimeSpan); //example output 15:36:15

( আপডেট ) এবং এখানে সি # 6 স্ট্রিং ইন্টারপোলেশন ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে:

$"{myTimeSpan:hh\\:mm\\:ss}"; //example output 15:36:15

আপনাকে ":" অক্ষরটি "\" দিয়ে পালাতে হবে (যা আপনি নিজে ভারব্যাটিম স্ট্রিং ব্যবহার না করা অবধি এড়াতে হবে)।

এমএসডিএন কাস্টম টাইমস্প্যান ফর্ম্যাট স্ট্রিং পৃষ্ঠাগুলির এই অংশটি ":" এবং "পালানোর বিষয়ে ব্যাখ্যা করে। একটি ফর্ম্যাট স্ট্রিং অক্ষর:

কাস্টম টাইমস্প্যান ফর্ম্যাট স্পেসিফায়ারগুলিতে স্থানধারক বিভাজক চিহ্নগুলি অন্তর্ভুক্ত নয়, যেমন প্রতীকগুলি কয়েক ঘন্টা, মিনিট থেকে কয়েক ঘন্টা বা ভগ্নাংশের সেকেন্ড থেকে কয়েক সেকেন্ডের মধ্যে পৃথক হয়। পরিবর্তে, এই চিহ্নগুলি স্ট্রিং আক্ষরিক হিসাবে কাস্টম ফর্ম্যাট স্ট্রিংয়ের মধ্যে অন্তর্ভুক্ত করা উচিত। উদাহরণস্বরূপ, "dd.hh: মিমি" একটি সময়কাল (।) কে দিন এবং ঘন্টাগুলির মধ্যে বিভাজক হিসাবে এবং একটি কোলন (:) কে ঘন্টা এবং মিনিটের মধ্যে বিভাজক হিসাবে সংজ্ঞায়িত করে।


7
@ আন্দ্রেই রিনিয়া: সঠিক, যেমনটি আমার দ্বিতীয় অনুচ্ছেদের শুরুতে বলা হয়েছে "। নেট 4 আপনাকে টাইমস্পানের সাথে কাস্টম বিন্যাসের স্ট্রিং ব্যবহার করতে দেয়"।
ডক্টর জোন্স

1
@ অ্যাডওয়ার্ড, এটি একেবারেই ঠিক নয়। আপনার উদাহরণে আপনি প্রথম মি এবং প্রথম এস এড়িয়ে চলেছেন, সুতরাং myTimeSpan = new TimeSpan(15, 35, 54);বিবৃতিটির একটি ইনপুট দিয়ে myTimeSpan .ToString("hh\\mm\\ss");ফলাফল হবে 15m35s54। আমি মনে করি না এটি আপনি যা চেয়েছিলেন তা আপনার ঘন্টা খানেক পরে এবং কয়েক মিনিটের পরে একটি গুলি স্থাপন করবে s
ডক্টর জোনস

1
@ ডক্টর জোন্স - আপনাকে ধন্যবাদ! আমার অর্থ ছিল MyTimeSpan.ToString ("h \\ hm \\ ms \\ s"); বা মাইটাইমস্প্যান.টিস্ট্রিং (@ "এইচ \ এইচএম \ এমএস \ এস"); যা 15h35m54s দেয়
এডওয়ার্ড

2
কেবল এই সমাধানটি সম্পর্কে সাবধানতা অবলম্বন করুন, কারণ
সময়টির অংশটি

1
@ কোয়ার্ক, এমন কোনও কাস্টম ফর্ম্যাট নির্দিষ্টকরণকারী নেই যা এগুলি করে, তারা সবাই আপনাকে এমন ঘন্টা দেয় যা দিনের অংশ হিসাবে গণনা করা হয় না। পরিবর্তে আপনি এটি করতে পারে $"{myTimeSpan.TotalHours}:{myTimeSpan:mm\\:ss}"। ব্যবহারকারীর দৃষ্টিকোণ থেকে, দিনগুলি আউটপুট করা আরও ভাল হতে পারে, 200+ ঘন্টার মধ্যে কত দিন মানসিকভাবে কেউ জানতে চায় না।
ডক্টর জোন্স

91

.NET 3.5 এবং নিম্নের জন্য আপনি ব্যবহার করতে পারেন:

string.Format ("{0:00}:{1:00}:{2:00}", 
               (int)myTimeSpan.TotalHours, 
                    myTimeSpan.Minutes, 
                    myTimeSpan.Seconds);

কোড একটি জন স্কিট থেকে নেওয়া উত্তর বাইট উপর

.NET 4.0 এবং তারপরের জন্য ডক্টা জোনজ উত্তরটি দেখুন


হ্যাঁ, আপনাকে ধন্যবাদ. তবে আমি মনে করি যে ডেটটাইম পদ্ধতিটি আরও স্বনির্ধারিত, কারণ এটি ডেটটাইম দ্বারা সমর্থিত যে কোনও সময় বিন্যাসের জন্য কাজ করবে। উদাহরণস্বরূপ AM / PM দেখানোর জন্য এই পদ্ধতির ব্যবহার করা শক্ত।
হোসাম অলি

1
অবশ্যই, টাইমস্প্যান সময়ের নির্দিষ্ট সময়ের প্রতিনিধিত্ব করে, দিনের একটি সময় নয় (যদিও ডেটটাইম.নো। আপনার যদি দিনের একটি নির্দিষ্ট সময় উপস্থাপনের প্রয়োজন হয় তবে আমি আপনাকে তারিখটাইম ক্লাস ব্যবহার চালিয়ে যাওয়ার পরামর্শ দিচ্ছি।
জোহানেস

7
কেবল মনে রাখবেন যে টাইমস্প্যানটি যদি 24 ঘন্টা বা তার বেশি হয় তবে আপনি ভুল ফর্ম্যাটিং পাবেন।
জোহানেস

31

একটি উপায় হ'ল একটি DateTimeবিষয় তৈরি করা এবং এটি ফর্ম্যাটের জন্য ব্যবহার করুন:

new DateTime(myTimeSpan.Ticks).ToString(myCustomFormat)

// or using String.Format:
String.Format("{0:HHmmss}", new DateTime(myTimeSpan.Ticks))

এইভাবেই আমি জানি। আমি আশা করি কেউ আরও ভাল উপায় প্রস্তাব করতে পারেন।


14
টাইমস্প্যান যদি কোনও দিনের চেয়ে কম হয় তবে এটি সত্যিই কাজ করবে। এটি এত ভয়াবহ বাধা নাও হতে পারে তবে এটি এটিকে সাধারণ সমাধান হতে বাধা দেয়।
tvanfosson

এটি কি সঠিক মূল্য ফেরত দেয়? অস্পষ্ট TS নিউ TimeSpan (11, 22, 30, 30) হিসাবে: অস্পষ্ট SSS স্ট্রিং = নিউ তারিখসময় (ts.Ticks) .ToString ( "dd.hh: মি: সে")
NeverHopeless

10

সহজ। TimeSpan.ToStringসি, জি বা জি ব্যবহার করুন। এমএসডিএন- এ আরও তথ্য


1
আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। নেট নেট 4 এ এই পদ্ধতিটি আপাতভাবে নতুন এবং প্রশ্নটি জিজ্ঞাসা করার সময় উপস্থিত ছিল না। এটি কাস্টম ফর্ম্যাটগুলিকে সমর্থন করে না। তবুও, এই প্রশ্নের উত্তরগুলির জন্য এটি একটি মূল্যবান সংযোজন। আবার ধন্যবাদ.
হোসাম অলি



5

ব্যক্তিগতভাবে, আমি এই পদ্ধতির পছন্দ করি:

TimeSpan ts = ...;
string.Format("{0:%d}d {0:%h}h {0:%m}m {0:%s}s", ts);

কোনও সমস্যা ছাড়াই আপনি নিজের পছন্দ মতো এটি তৈরি করতে পারেন:

string.Format("{0:%d}days {0:%h}hours {0:%m}min {0:%s}sec", ts);
string.Format("{0:%d}d {0:%h}h {0:%m}' {0:%s}''", ts);

5

এটি দুর্দান্ত একটি:

string.Format("{0:00}:{1:00}:{2:00}",
               (int)myTimeSpan.TotalHours,
               myTimeSpan.Minutes,
               myTimeSpan.Seconds);

1
আপনাকে আমার টাইমস্প্যান.টোটাল ঘন্টাগুলি একটি ইনটকে কাস্ট করতে হবে - অন্যথায় এটি বৃত্তাকার হয়ে উঠতে পারে।
জোহানেসএইচের

3

আপনি এর সাথে যেতে পারেন:

Dim ts As New TimeSpan(35, 21, 59, 59)  '(11, 22, 30, 30)    '
Dim TimeStr1 As String = String.Format("{0:c}", ts)
Dim TimeStr2 As String = New Date(ts.Ticks).ToString("dd.HH:mm:ss")

সম্পাদনা করুন:

আপনি স্ট্রিংস.ফর্ম্যাট দেখতে পারেন ।

    Dim ts As New TimeSpan(23, 30, 59)
    Dim str As String = Strings.Format(New DateTime(ts.Ticks), "H:mm:ss")

3
if (timeSpan.TotalDays < 1)
    return timeSpan.ToString(@"hh\:mm\:ss");

return timeSpan.TotalDays < 2
    ? timeSpan.ToString(@"d\ \d\a\y\ hh\:mm\:ss")
    : timeSpan.ToString(@"d\ \d\a\y\s\ hh\:mm\:ss");

সমস্ত আক্ষরিক অক্ষর এড়াতে হবে।


1

আমি নীচের কোডটি ব্যবহার করেছি। এটি দীর্ঘ, তবে তবুও এটি একটি অভিব্যক্তি, এবং খুব বন্ধুত্বপূর্ণ আউটপুট উত্পাদন করে, কারণ এটি শূন্যের মান থাকলে তাদের দিন, ঘন্টা, মিনিট বা সেকেন্ড আউটপুট দেয় না।

নমুনায় এটি আউটপুট উত্পাদন করে: "4 দিন 1 ঘন্টা 3 সেকেন্ড"।

TimeSpan sp = new TimeSpan(4,1,0,3);
string.Format("{0}{1}{2}{3}", 
        sp.Days > 0 ? ( sp.Days > 1 ? sp.ToString(@"d\ \d\a\y\s\ "): sp.ToString(@"d\ \d\a\y\ ")):string.Empty,
        sp.Hours > 0 ? (sp.Hours > 1 ? sp.ToString(@"h\ \h\o\u\r\s\ ") : sp.ToString(@"h\ \h\o\u\r\ ")):string.Empty,
        sp.Minutes > 0 ? (sp.Minutes > 1 ? sp.ToString(@"m\ \m\i\n\u\t\e\s\ ") :sp.ToString(@"m\ \m\i\n\u\t\e\ ")):string.Empty,
        sp.Seconds > 0 ? (sp.Seconds > 1 ? sp.ToString(@"s\ \s\e\c\o\n\d\s"): sp.ToString(@"s\ \s\e\c\o\n\d\s")):string.Empty);

এখন এটি লেখার আরও অনেক ভাল উপায় আছে! সমস্ত সাধারণ ক্রিয়াকলাপকে রিফ্যাক্টর করার চেষ্টা করুন এবং আপনি এই কোডটি আরও অনেক বেশি সুন্দর দেখতে পারেন।
হোসাম অলি

@ হোসাম এলি; আমি সব সময় শিখছি, আপনি কি নিজের উন্নত কোডটি পোস্ট করবেন?
পানপাওয়েল

String timeComponent(int value, String name) { return value > 0 ? value + " " + name + (value > 1 ? "s" : ""); }প্রতিটি উপাদান (যেমন timeComponent(sp.Days, "day")) এর জন্য কল করুন , তারপরে String.joinস্পেসগুলি সন্নিবেশ করানোর জন্য ব্যবহার করুন ।
হোসাম এলি

1

আমি এই পদ্ধতিটি ব্যবহার করি। আমি বেলজিয়াম এবং ডাচ বলতে তাই বহু ঘন্টা এবং মিনিটের বহুবচন কেবল শেষের দিকে 's' যোগ করে না তবে একবচন থেকে প্রায় আলাদা শব্দ।

এটি দীর্ঘ মনে হতে পারে তবে এটি আমার মনে হয় খুব পঠনযোগ্য:

 public static string SpanToReadableTime(TimeSpan span)
    {
        string[] values = new string[4];  //4 slots: days, hours, minutes, seconds
        StringBuilder readableTime = new StringBuilder();

        if (span.Days > 0)
        {
            if (span.Days == 1)
                values[0] = span.Days.ToString() + " dag"; //day
            else
                values[0] = span.Days.ToString() + " dagen";  //days

            readableTime.Append(values[0]);
            readableTime.Append(", ");
        }
        else
            values[0] = String.Empty;


        if (span.Hours > 0)
        {
            if (span.Hours == 1)
                values[1] = span.Hours.ToString() + " uur";  //hour
            else
                values[1] = span.Hours.ToString() + " uren";  //hours

            readableTime.Append(values[1]);
            readableTime.Append(", ");

        }
        else
            values[1] = string.Empty;

        if (span.Minutes > 0)
        {
            if (span.Minutes == 1)
                values[2] = span.Minutes.ToString() + " minuut";  //minute
            else
                values[2] = span.Minutes.ToString() + " minuten";  //minutes

            readableTime.Append(values[2]);
            readableTime.Append(", ");
        }
        else
            values[2] = string.Empty;

        if (span.Seconds > 0)
        {
            if (span.Seconds == 1)
                values[3] = span.Seconds.ToString() + " seconde";  //second
            else
                values[3] = span.Seconds.ToString() + " seconden";  //seconds

            readableTime.Append(values[3]);
        }
        else
            values[3] = string.Empty;


        return readableTime.ToString();
    }//end SpanToReadableTime

আপনি যদি এমন সফ্টওয়্যার লিখেন যা অনুবাদ করা দরকার, তবে এটি বেশ এগিয়ে যাওয়ার উপায়। স্ট্যান্ডার্ড টাইমস্প্যান.টস্ট্রিং () সাধারণ শেষ ব্যবহারকারীদের বোঝার জন্য খুব জটিল is
নিল

1

শর্তসাপেক্ষ বিন্যাসের সাথে আমি নিজের স্ব ব্যবহার করলাম এটিই। এবং আমি এটি এখানে পোস্ট করি কারণ আমি মনে করি এটি পরিষ্কার উপায়।

$"{time.Days:#0:;;\\}{time.Hours:#0:;;\\}{time.Minutes:00:}{time.Seconds:00}"

আউটপুট উদাহরণ:

00:00 (সর্বনিম্ন)

1:43:04 (যখন আমাদের ঘন্টা থাকে)

15:03:01 (যখন ঘন্টাগুলি 1 ডিজিটের বেশি হয়)

2:4:22:04 (যখন আমাদের দিন আছে))

ফর্ম্যাট করা সহজ। time.Days:#0:;;\\পূর্বে বিন্যাসটি ;;যখন মান ধনাত্মক হয় for নেতিবাচক মান অগ্রাহ্য করা হয়। এবং শূন্য মানের জন্য ;;\\এটি ফর্ম্যাট স্ট্রিং এ আড়াল করার জন্য আমাদের আছে । মনে রাখবেন যে পালানো ব্যাকস্ল্যাশ প্রয়োজনীয়, অন্যথায় এটি সঠিকভাবে ফর্ম্যাট হবে না।


1

আমার এক্সটেনশন পদ্ধতিটি এখানে :

public static string ToFormattedString(this TimeSpan ts)
{
    const string separator = ", ";

    if (ts.TotalMilliseconds < 1) { return "No time"; }

    return string.Join(separator, new string[]
    {
        ts.Days > 0 ? ts.Days + (ts.Days > 1 ? " days" : " day") : null,
        ts.Hours > 0 ? ts.Hours + (ts.Hours > 1 ? " hours" : " hour") : null,
        ts.Minutes > 0 ? ts.Minutes + (ts.Minutes > 1 ? " minutes" : " minute") : null,
        ts.Seconds > 0 ? ts.Seconds + (ts.Seconds > 1 ? " seconds" : " second") : null,
        ts.Milliseconds > 0 ? ts.Milliseconds + (ts.Milliseconds > 1 ? " milliseconds" : " millisecond") : null,
    }.Where(t => t != null));
}

উদাহরণ কল:

string time = new TimeSpan(3, 14, 15, 0, 65).ToFormattedString();

আউটপুট:

3 days, 14 hours, 15 minutes, 65 milliseconds

1

এটি ভিএস ২০১০ এর একটি ব্যথা, এখানে আমার কাজের সমাধান solution

 public string DurationString
        {
            get 
            {
                if (this.Duration.TotalHours < 24)
                    return new DateTime(this.Duration.Ticks).ToString("HH:mm");
                else //If duration is more than 24 hours
                {
                    double totalminutes = this.Duration.TotalMinutes;
                    double hours = totalminutes / 60;
                    double minutes = this.Duration.TotalMinutes - (Math.Floor(hours) * 60);
                    string result = string.Format("{0}:{1}", Math.Floor(hours).ToString("00"), Math.Floor(minutes).ToString("00"));
                    return result;
                }
            } 
        }

1

Substringপদ্ধতি ঠিকভাবে কাজ যখন আপনি শুধুমাত্র ঘন্টা চাই: মিনিট: সেকেন্ড। এটি সহজ, পরিষ্কার কোড এবং সহজে বোঝা যায়।

    var yourTimeSpan = DateTime.Now - DateTime.Now.AddMinutes(-2);

    var formatted = yourTimeSpan.ToString().Substring(0,8);// 00:00:00 

    Console.WriteLine(formatted);

0

এখানে আমার সংস্করণ। এটি কেবলমাত্র প্রয়োজনীয় হিসাবে দেখায়, বহুবচন পরিচালনা করে, নেতিবাচক, এবং আমি এটিকে হালকা করে তোলার চেষ্টা করেছি।

আউটপুট উদাহরণ

0 seconds
1.404 seconds
1 hour, 14.4 seconds
14 hours, 57 minutes, 22.473 seconds
1 day, 14 hours, 57 minutes, 22.475 seconds

কোড

public static class TimeSpanExtensions
{
    public static string ToReadableString(this TimeSpan timeSpan)
    {
        int days = (int)(timeSpan.Ticks / TimeSpan.TicksPerDay);
        long subDayTicks = timeSpan.Ticks % TimeSpan.TicksPerDay;

        bool isNegative = false;
        if (timeSpan.Ticks < 0L)
        {
            isNegative = true;
            days = -days;
            subDayTicks = -subDayTicks;
        }

        int hours = (int)((subDayTicks / TimeSpan.TicksPerHour) % 24L);
        int minutes = (int)((subDayTicks / TimeSpan.TicksPerMinute) % 60L);
        int seconds = (int)((subDayTicks / TimeSpan.TicksPerSecond) % 60L);
        int subSecondTicks = (int)(subDayTicks % TimeSpan.TicksPerSecond);
        double fractionalSeconds = (double)subSecondTicks / TimeSpan.TicksPerSecond;

        var parts = new List<string>(4);

        if (days > 0)
            parts.Add(string.Format("{0} day{1}", days, days == 1 ? null : "s"));
        if (hours > 0)
            parts.Add(string.Format("{0} hour{1}", hours, hours == 1 ? null : "s"));
        if (minutes > 0)
            parts.Add(string.Format("{0} minute{1}", minutes, minutes == 1 ? null : "s"));
        if (fractionalSeconds.Equals(0D))
        {
            switch (seconds)
            {
                case 0:
                    // Only write "0 seconds" if we haven't written anything at all.
                    if (parts.Count == 0)
                        parts.Add("0 seconds");
                    break;

                case 1:
                    parts.Add("1 second");
                    break;

                default:
                    parts.Add(seconds + " seconds");
                    break;
            }
        }
        else
        {
            parts.Add(string.Format("{0}{1:.###} seconds", seconds, fractionalSeconds));
        }

        string resultString = string.Join(", ", parts);
        return isNegative ? "(negative) " + resultString : resultString;
    }
}

0

আপনি যদি সেকেন্ডের সংখ্যার ভিত্তিতে সময়কালীন ফর্ম্যাটটি ইউটিউবের মতো করতে চান

int[] duration = { 0, 4, 40, 59, 60, 61, 400, 4000, 40000, 400000 };
foreach (int d in duration)
{
    Console.WriteLine("{0, 6} -> {1, 10}", d, d > 59 ? TimeSpan.FromSeconds(d).ToString().TrimStart("00:".ToCharArray()) : string.Format("0:{0:00}", d));
}

আউটপুট:

     0 ->       0:00
     4 ->       0:04
    40 ->       0:40
    59 ->       0:59
    60 ->       1:00
    61 ->       1:01
   400 ->       6:40
  4000 ->    1:06:40
 40000 ->   11:06:40
400000 -> 4.15:06:40

0

আমি "1 দিন 2 ঘন্টা 3 মিনিট" এর মতো স্ট্রিংটি ফিরে আসতে চেয়েছিলাম এবং উদাহরণস্বরূপ দিনগুলি বা মিনিট 0 হয় এবং তারপরে সেগুলি প্রদর্শন না করে তাও বিবেচনায় নিতে পারি। জন রাশকে তার উত্তরের জন্য ধন্যবাদ যা আমার সবেমাত্র একটি এক্সটেনশন

TimeSpan timeLeft = New Timespan(0, 70, 0);
String.Format("{0}{1}{2}{3}{4}{5}",
    Math.Floor(timeLeft.TotalDays) == 0 ? "" : 
    Math.Floor(timeLeft.TotalDays).ToString() + " ",
    Math.Floor(timeLeft.TotalDays) == 0 ? "" : Math.Floor(timeLeft.TotalDays) == 1 ? "day " : "days ",
    timeLeft.Hours == 0 ? "" : timeLeft.Hours.ToString() + " ",
    timeLeft.Hours == 0 ? "" : timeLeft.Hours == 1 ? "hour " : "hours ",
    timeLeft.Minutes == 0 ? "" : timeLeft.Minutes.ToString() + " ",
    timeLeft.Minutes == 0 ? "" : timeLeft.Minutes == 1 ? "minute " : "minutes ");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.