এমন কোনও জাভা লাইব্রেরি কি কেউ জানেন যা সি # তে একইভাবে একাধিক মিলি সেকেন্ডে মুদ্রণ করতে পারে?
উদাহরণস্বরূপ, দীর্ঘ হিসাবে 123456 এমএস 4d1h3m5 এস হিসাবে মুদ্রিত হবে।
এমন কোনও জাভা লাইব্রেরি কি কেউ জানেন যা সি # তে একইভাবে একাধিক মিলি সেকেন্ডে মুদ্রণ করতে পারে?
উদাহরণস্বরূপ, দীর্ঘ হিসাবে 123456 এমএস 4d1h3m5 এস হিসাবে মুদ্রিত হবে।
%
এবং /
সংখ্যাটি অংশগুলিতে বিভক্ত করুন। প্রস্তাবিত উত্তরগুলির চেয়ে প্রায় সহজ।
/
এবং %
।
উত্তর:
একটি পিরিয়ডফর্মেটর বিল্ডার ব্যবহার করে জোদা টাইমের খুব ভাল উপায় আছে ।
দ্রুত জয়: PeriodFormat.getDefault().print(duration.toPeriod());
যেমন
//import org.joda.time.format.PeriodFormatter;
//import org.joda.time.format.PeriodFormatterBuilder;
//import org.joda.time.Duration;
Duration duration = new Duration(123456); // in milliseconds
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendDays()
.appendSuffix("d")
.appendHours()
.appendSuffix("h")
.appendMinutes()
.appendSuffix("m")
.appendSeconds()
.appendSuffix("s")
.toFormatter();
String formatted = formatter.print(duration.toPeriod());
System.out.println(formatted);
PeriodType.daysTime()
বা .standard()
সহায়তা করে নি
আমি জাভা 8 এর Duration.toString()
এবং কিছুটা রেইগেক্স ব্যবহার করে একটি সহজ সমাধান তৈরি করেছি :
public static String humanReadableFormat(Duration duration) {
return duration.toString()
.substring(2)
.replaceAll("(\\d[HMS])(?!$)", "$1 ")
.toLowerCase();
}
ফলাফলটি দেখতে পাবেন:
- 5h
- 7h 15m
- 6h 50m 15s
- 2h 5s
- 0.1s
আপনি যদি এর মধ্যে শূন্যস্থান না চান তবে কেবল সরিয়ে দিন replaceAll
।
Duration::toString
সংজ্ঞায়িত এবং সুসজ্জিত আইএসও 8601 স্ট্যান্ডার্ড অনুসারে আউটপুট ফর্ম্যাট হওয়ার কারণে পরিবর্তন করা অসম্ভব ।
.replaceAll("\\.\\d+", "")
কল করার আগে যুক্ত করুন toLowerCase()
।
অ্যাপাচি কমন্স-ল্যাং এটির পাশাপাশি ডিওরেশনফর্ম্যাটU টি ব্যবহার করতে একটি দরকারী ক্লাস সরবরাহ করে
উদাহরণস্বরূপ
DurationFormatUtils.formatDurationHMS( 15362 * 1000 ) )
=> 4: 16: 02.000 (এইচ: এম: এস.মিলিস) DurationFormatUtils.formatDurationISO( 15362 * 1000 ) )
=> পি0 ওয়াইএমএমডিডি 4 এইচ 16 এম 2.000
এস, সিএফ. আইএসও 8601
জোডাটাইমের একটি Period
শ্রেণি রয়েছে যা এ জাতীয় পরিমাণ উপস্থাপন করতে পারে IsoPeriodFormat
এবং আইএসও 8601 ফর্ম্যাটে (মাধ্যমে ) রেন্ডার করা যেতে পারে PT4D1H3M5S
, যেমন
Period period = new Period(millis);
String formatted = ISOPeriodFormat.standard().print(period);
যদি সেই ফর্ম্যাটটি আপনি চান না, তবে PeriodFormatterBuilder
আপনাকে আপনার সি #-স্টাইল সহ স্বেচ্ছাসেবক লেআউটগুলি একত্রিত করতে দেয় 4d1h3m5s
।
new Period(millis).toString()
ব্যবহার করে ISOPeriodFormat.standard()
।
জাভা 8 এর সাহায্যে আপনি আইএসও 8601 সেকেন্ড ভিত্তিক উপস্থাপনা যেমন পিটি 8 এইচ 6 এম 12.345 এস ব্যবহার করে এটি বাহ্যিক লাইব্রেরি ছাড়া বিন্যাস করার toString()
পদ্ধতিটিও ব্যবহার করতে পারেন ।java.time.Duration
খাঁটি জেডিকে কোড ব্যবহার করে আপনি এটি কীভাবে করতে পারেন তা এখানে:
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
long diffTime = 215081000L;
Duration duration = DatatypeFactory.newInstance().newDuration(diffTime);
System.out.printf("%02d:%02d:%02d", duration.getDays() * 24 + duration.getHours(), duration.getMinutes(), duration.getSeconds());
org.threeten.extra.AmountFormats.wordBased
ThreeTen-অতিরিক্ত প্রকল্প, যা স্টিফেন Colebourne, JSR 310, লেখক দ্বারা পরিচালিত হয় java.time এবং Joda-টাইম , একটি হয়েছে AmountFormats
বর্গ যেটি মান জাভা 8 তারিখ সময় শ্রেণীর সাথে কাজ করে। এটি আরও কমপ্যাক্ট আউটপুট জন্য কোনও বিকল্প নেই, যদিও মোটামুটি ভার্জোজ।
Duration d = Duration.ofMinutes(1).plusSeconds(9).plusMillis(86);
System.out.println(AmountFormats.wordBased(d, Locale.getDefault()));
1 minute, 9 seconds and 86 milliseconds
জাভা 9+
Duration d1 = Duration.ofDays(0);
d1 = d1.plusHours(47);
d1 = d1.plusMinutes(124);
d1 = d1.plusSeconds(124);
System.out.println(String.format("%s d %sh %sm %ss",
d1.toDaysPart(),
d1.toHoursPart(),
d1.toMinutesPart(),
d1.toSecondsPart()));
2 ডি 1 এইচ 6 এম 4 এস
জোদা-সময়ের বিল্ডার-পদ্ধতির বিকল্প একটি প্যাটার্ন-ভিত্তিক সমাধান হবে । এটি আমার লাইব্রেরি টাইম 4 জে অফার করেছে । ক্লাসের সময়কাল ব্যবহারের উদাহরণ For ফর্ম্যাটর (আরও পঠনযোগ্যতার জন্য কিছু স্পেস যুক্ত করেছে - স্পেসগুলি সরিয়ে কাঙ্ক্ষিত সি #-স্টাইল উপস্থাপন করবে):
IsoUnit unit = ClockUnit.MILLIS;
Duration<IsoUnit> dur = // normalized duration with multiple components
Duration.of(123456, unit).with(Duration.STD_PERIOD);
Duration.Formatter<IsoUnit> f = // create formatter/parser with optional millis
Duration.Formatter.ofPattern("D'd' h'h' m'm' s[.fff]'s'");
System.out.println(f.format(dur)); // output: 0d 0h 2m 3.456s
এই ফর্ম্যাটরটি- java.time
এপিআইয়ের সময়কালগুলিও মুদ্রণ করতে পারে (তবে, এই ধরণের সাধারণকরণের বৈশিষ্ট্যগুলি কম শক্তিশালী):
System.out.println(f.format(java.time.Duration.ofMillis(123456))); // output: 0d 0h 2m 3.456s
ওপির প্রত্যাশা যে "123456 এমএস দীর্ঘ হিসাবে 4d1h3m5s হিসাবে মুদ্রিত হবে" স্পষ্টতই ভুল উপায়ে গণনা করা হয়। আমি কারণ হিসাবে opালু অনুমান। উপরে বর্ণিত একই সময়কালের ফর্ম্যাটরটিকেও পার্সার হিসাবে ব্যবহার করা যেতে পারে। নিম্নলিখিত কোডটি দেখায় যে "4d1h3m5s" বরং এর সাথে মিলেছে 349385000 = 1000 * (4 * 86400 + 1 * 3600 + 3 * 60 + 5)
:
System.out.println(
f.parse("4d 1h 3m 5s")
.toClockPeriodWithDaysAs24Hours()
.with(unit.only())
.getPartialAmount(unit)); // 349385000
ক্লাসটি ব্যবহার করা হচ্ছে net.time4j.PrettyTime
(যা স্থানীয়ভাবে আউটপুট এবং "কাল", "পরের রবিবার", "4 দিন আগে" ইত্যাদির মতো আপেক্ষিক সময়ের মুদ্রণের জন্যও ভাল):
String s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.NARROW);
System.out.println(s); // output: 2m 3s 456ms
s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds, and 456 milliseconds
s = PrettyTime.of(Locale.UK).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds and 456 milliseconds
সংক্ষিপ্তসারগুলি ব্যবহৃত হয় বা না হয় তবে পাঠ্যের প্রস্থ নিয়ন্ত্রণ করে। তালিকার বিন্যাসটি উপযুক্ত লোকেল চয়ন করেও নিয়ন্ত্রণ করা যায়। উদাহরণস্বরূপ, স্ট্যান্ডার্ড ইংরাজী অক্সফর্ম কমা ব্যবহার করে, যখন যুক্তরাজ্য তা করে না। টাইম 4 জের সর্বশেষতম সংস্করণ v5.5 90 টিরও বেশি ভাষাগুলি সমর্থন করে এবং সিএলডিআর-সংগ্রহস্থল (একটি শিল্প মান) এর ভিত্তিতে অনুবাদ ব্যবহার করে uses
ব্যবহারকারী 678573 এর উত্তরের উপর ভিত্তি করে একটি জাভা 8 সংস্করণ :
private static String humanReadableFormat(Duration duration) {
return String.format("%s days and %sh %sm %ss", duration.toDays(),
duration.toHours() - TimeUnit.DAYS.toHours(duration.toDays()),
duration.toMinutes() - TimeUnit.HOURS.toMinutes(duration.toHours()),
duration.getSeconds() - TimeUnit.MINUTES.toSeconds(duration.toMinutes()));
}
... যেহেতু জাভা 8 তে কোনও পিরিয়ডফর্ম্যাটর নেই এবং গেটহর্স, গেটমিনেটস, ... এর মতো কোনও পদ্ধতি নেই
আমি জাভা 8 এর জন্য আরও ভাল সংস্করণ দেখে খুশি হব।
আমি বুঝতে পারি এটি আপনার ব্যবহারের ক্ষেত্রে হুবহু মাপসই নয়, তবে প্রাইটিটাইম এখানে কার্যকর হতে পারে।
PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
//prints: “right now”
System.out.println(p.format(new Date(1000*60*10)));
//prints: “10 minutes from now”
Duration
যুক্তিসম্মত মান সংজ্ঞায়িত, আইএসও 8601 :PnYnMnDTnHnMnS
যেখানেP
মানে হলো "সময়কাল" এবং চিহ্ন শুরুতেT
সময় অংশ থেকে তারিখ অংশ আলাদা করে, এবং এর মধ্যে একটি একক সঙ্গে একটি সংখ্যা ঐচ্ছিক occurrances হয় লেটার সংক্ষেপণ উদাহরণস্বরূপ,PT4H30M
= সাড়ে চার ঘন্টা।