কীভাবে বর্তমান টাইমমিলিসকে জাভাতে একটি তারিখে রূপান্তর করবেন?


140

সার্ভারে উত্পন্ন কিছু লগ ফাইলটিতে আমার কাছে মিলিসেকেন্ড রয়েছে, আমি লগ ফাইলটিও জানি যেখানে থেকে লগ ফাইলটি উত্পন্ন হয়েছিল, আমার সমস্যাটি নির্দিষ্ট বিন্যাসে মিলিসেকেন্ডগুলিকে তারিখে রূপান্তর করা। সেই লগটির প্রক্রিয়াকরণটি বিভিন্ন টাইম জোনে অবস্থিত সার্ভারে ঘটছে। "সিম্পলডিটফর্ম্যাট" প্রোগ্রামে রূপান্তর করার সময় মেশিনের তারিখ গ্রহণ করা হচ্ছে কারণ এই ধরণের ফর্ম্যাটেড তারিখটি সার্ভারের সঠিক সময়কে উপস্থাপন করে না। এটিকে মার্জিতভাবে পরিচালনা করার কোনও উপায় আছে কি?

long yourmilliseconds = 1322018752992l;
        //1322018752992-Nov 22, 2011 9:25:52 PM 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);

System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));

DateTime jodaTime = new DateTime(yourmilliseconds, 
                    DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");

System.out.println("jodaTime "+parser1.print(jodaTime));

আউটপুট:

Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992

লোকালকে সময় অঞ্চল দিয়ে বিভ্রান্ত করবেন না। সম্পূর্ণ আলাদা। লোকেল মাস এবং দিনগুলির নাম, এবং সংস্কৃতিগত নিয়ম যেমন মাস, দিন ইত্যাদির অংশগুলির ক্রম হিসাবে নির্ধারণ করে। একটি সময় অঞ্চল অফসেট-ইউটিসি-র সাথে ডায়ালাইট সেভিং টাইম-এর মতো অসঙ্গতিগুলি পরিচালনা করার নিয়ম।
বাসিল বাউরকে

মিলিসেকেন্ডের সংখ্যাটি 1970-01-01T00: 00: 00Z না হয়ে অন্য কোনও মুহুর্তের থেকে গণনা হিসাবে সমস্যা ছিল?
বেসিল বাউরকে

এফওয়াইআই, উভয় ভয়ানক পুরানো তারিখের সময় ক্লাস ( GregorianCalendar, SimpleDateFormatইত্যাদি) এবং দুর্দান্ত জোডা-টাইম লাইব্রেরি এখন আধুনিক জাভা.টাইম ক্লাস দ্বারা পরিবেশন করা হয়েছে
বেসিল বাউরক

উত্তর:


115
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);

int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);

এটি কার্যকর করার জন্য আমাকে ক্যালেন্ডারটি চূড়ান্ত হিসাবে সেট করতে হয়েছিল। final Calendar calendar = Calendar.getInstance();
ভিক্টর অগস্টো

4
ক্যালেন্ডার অবজেক্টগুলি সাধারণত বেশ বড় হিসাবে বিবেচিত হয়, তাই সম্ভব হলে এড়ানো উচিত। একটি তারিখের অবজেক্টটি আপনার প্রয়োজনীয় কার্যকারিতাটি ধরে নিলে এটি আরও ভালভাবে ধরে চলেছে। "তারিখের তারিখ = নতুন তারিখ (মিলিস);" ব্যবহারকারী এভিডি দ্বারা অন্য উত্তরে প্রদত্ত সেরা রুট হতে চলেছে :)
ডিক লুকাস

1
একরকম, 1515436200000lআমি calendar.get(Calendar.MONTH))যেমন পাচ্ছি 0!
সজিব আচার্য

অবগতির জন্য, যেমন ভয়ঙ্কর বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 এবং পরে পাতাটা ক্লাস। ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
তুলিল বাউরক

2
@ সজিবআচার্য নোট করুন যে ক্যালেন্ডারের জন্য দৃষ্টান্তগুলি ON আমরা জানি এটি "আসল" মাস পেতে আপনাকে একটি যুক্ত করতে হবে। উদাহরণ: 0 = জানুয়ারী, 1 = ফেব্রুয়ারি, 2 = মার্চ, ইত্যাদি
শাগবার্গ

256

আপনি java.util.Dateক্লাস ব্যবহার করতে পারেন এবং তারপরে SimpleDateFormatবিন্যাসটি ব্যবহার করতে পারেন Date

Date date=new Date(millis);

আমরা জাভা.টাইম প্যাকেজ (টিউটোরিয়াল) ব্যবহার করতে পারি - জাভা এসই 8-তে প্রবর্তিত ডেটটাইম এপিআই।

var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
                        .ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
                            .ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));

// Format the date

var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);

2
আরও অনেক দক্ষ।
চাদ বিংহাম

2
নাঃ। সমস্ত পদ্ধতি java.util.Dateঅবমূল্যায়ন করা হয় না। (জেডি কে 8 এর উন্নত তারিখ ও সময় এপিআই রয়েছে java.time)
অ্যাডটাপস্ট

1
@ রাফায়েলজেফা, '' '' তারিখ (দীর্ঘ তারিখ) '' '
নির্মাতা অবমানিত

পিছনের সামঞ্জস্যের জন্য তারিখ অবজেক্ট সরবরাহ করা হয়। উপরে প্রস্তাবিত হিসাবে ভাল ব্যবহার ক্যালেন্ডার।
টন স্নোই

2
অবগতির জন্য, যেমন ভয়ঙ্কর বিরক্তিজনক পুরাতন তারিখ-সময় শ্রেণীর java.util.Date, java.util.Calendarএবং java.text.SimpleDateFormatএখন উত্তরাধিকার দ্বারা supplanted java.time জাভা 8 এবং পরে পাতাটা ক্লাস। ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
তুলিল বাউরক

24

TL; ড

Instant.ofEpochMilli( 1_322_018_752_992L )     // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
       .atZone( ZoneId.of( "Africa/Tunis" ) )  // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.

বিস্তারিত

অন্যান্য উত্তরগুলি বহির্মুখী বা ভুল ক্লাস ব্যবহার করে।

পুরানো তারিখের সময় ক্লাসগুলি যেমন java.util.Date/.C ক্যালেন্ডার এড়িয়ে চলুন। তারা খারাপভাবে নকশাকৃত, বিভ্রান্তিকর এবং সমস্যাযুক্ত হিসাবে প্রমাণিত হয়েছে।

java.time

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা আসে। কার্যকারিতাটির বেশিরভাগটি জাভা 6 এবং 7ব্যাকপোর্ট করা হয়েছে এবং আরও অ্যান্ড্রয়েডে অভিযোজিতজোদা-সময়কে তৈরি করেছিল এমন কিছু লোকের দ্বারা তৈরি ।

একটি Instantমধ্যে টাইমলাইনে একটি মুহূর্ত ইউটিসি একটি রেজোলিউশনে ন্যানোসেকেন্ড । ইউটিসিতে এর যুগটি 1970 এর প্রথম মুহূর্ত।

ধরে নিই আপনার ইনপুট ডেটা 1970-01-01T00: 00: 00Z (প্রশ্নের মধ্যে পরিষ্কার নয়) থেকে মিলিসেকেন্ডের একটি গণনা, তাহলে আমরা সহজেই একটি ইনস্ট্যান্ট করতে পারি Instant

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

তাত্ক্ষণিক.আর স্ট্রিং (): 2011-11-23T03: 25: 52.992Z

Zযে আদর্শ মধ্যে আইএসও 8601 বিন্যস্ত স্ট্রিং-এর সংক্ষিপ্ত রূপ Zuluএবং এর মানে হল ইউটিসি

যথাযথ টাইম জোনের নাম ব্যবহার করে একটি সময় অঞ্চল প্রয়োগ করুন , ক ZonedDateTime

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );

IdeOne.com এ এই কোডটি সরাসরি চালিত দেখুন ।

Asia/Kolkata সময় অঞ্চল ?

আমি অনুমান করছি যে আপনার কোডগুলি প্রভাবিত করে এমন একটি ভারত টাইম অঞ্চল ছিল। আমরা এখানে দেখতে পেলাম যে Asia/Kolkataসময় প্রতিবেদনের সাথে সামঞ্জস্য করা আপনার সময়কালের একই সময়ের প্রস্তাব দেয় 08:55যা আমাদের ইউটিসি মান থেকে সাড়ে পাঁচ ঘন্টা এগিয়ে 03:25

2011-11-23T08: 55: 52.992 +05: 30 [এশিয়া / কলকাতা]

ডিফল্ট অঞ্চল

আপনি জেভিএমের বর্তমান ডিফল্ট সময় অঞ্চল প্রয়োগ করতে পারেন । সাবধান থাকুন যে রানটাইম চলাকালীন সময়ে যে কোনও মুহূর্তে ডিফল্ট পরিবর্তন হতে পারে । JVM এর মধ্যে যে কোনও অ্যাপের যে কোনও থ্রেডের যে কোনও কোডই বর্তমান ডিফল্ট পরিবর্তন করতে পারে। গুরুত্বপূর্ণ হলে ব্যবহারকারীকে তাদের কাঙ্ক্ষিত / প্রত্যাশিত সময় অঞ্চলটি জিজ্ঞাসা করুন।

ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

জাভা.টাইম সম্পর্কে

Java.time ফ্রেমওয়ার্ক জাভা 8 এবং পরে পাতাটা করা হয়। এই ক্লাসগুলি , & , এর মতো সমস্যাযুক্ত পুরানো উত্তরাধিকারের তারিখ-সময়ের ক্লাসগুলিকে সহায়তা করে ।java.util.DateCalendarSimpleDateFormat

Joda-টাইম প্রকল্প, এখন রক্ষণাবেক্ষণ মোড , মাইগ্রেশনে উপদেশ java.time ক্লাস।

আরও জানতে, ওরাকল টিউটোরিয়ালটি দেখুন । এবং অনেক উদাহরণ এবং ব্যাখ্যার জন্য স্ট্যাক ওভারফ্লো অনুসন্ধান করুন। স্পেসিফিকেশনটি জেএসআর 310

একটি সঙ্গে JDBC ড্রাইভার মেনে চলার JDBC এর 4.2 বা পরবর্তী, আপনি বিনিময় পারে java.time আপনার ডাটাবেস সাথে সরাসরি অবজেক্ট। স্ট্রিং বা জাভা.এসকিউএল। * ক্লাসের প্রয়োজন নেই।

জাভা.টাইম ক্লাস কোথায় পাবেন?

ThreeTen-অতিরিক্ত প্রকল্প অতিরিক্ত শ্রেণীর সাথে java.time প্রসারিত করে। এই প্রকল্পটি জাভা.টাইমে সম্ভাব্য ভবিষ্যতের সংযোজনগুলির একটি প্রমাণযোগ্য ক্ষেত্র। আপনি এখানে কিছু দরকারী শ্রেণীর যেমন খুঁজে পেতে পারেন Interval, YearWeek, YearQuarter, এবং আরো


আপনি উপরে প্রস্তাবিত তাত্ক্ষণিকটিকে স্থানীয় সময় অঞ্চলে রূপান্তর করা সহজ হবে যে কোনও ডিভাইসে ডিফল্ট (উদাহরণস্বরূপ, একটি স্মার্টফোন)?
এজেডাব্লু

1
@ এজেডাব্লু হ্যাঁ কল করুন ZoneId.systemDefault()। আমার উত্তরের শেষে যুক্ত হওয়া নতুন বিভাগটি দেখুন।
বেসিল বাউর্ক

দুর্দান্ত, আমি চেষ্টা করে দেখব।
এজেডাব্লু

14

এটি করার সবচেয়ে সহজ উপায় হ'ল জোদা ডেটটাইম ক্লাসটি ব্যবহার করা এবং মিলি সেকেন্ডে এবং টাইমস্টোন যা আপনি চান তা উভয় টাইমস্ট্যাম্প নির্দিষ্ট করে।

আমি অন্তর্নিহিত জাভা তারিখ এবং ক্যালেন্ডার ক্লাসগুলি এড়ানো দৃ ;়ভাবে সুপারিশ করছি; তারা ভয়ানক।


গর্জিয়ান ক্যালেন্ডার কাজ করেনি ... কারণেই এটি সিস্টেমের ডিফল্ট সময় অঞ্চল নেয়। জোদা পুরোপুরি কাজ করেছে।
অমিত

গ্রেগরিয়ানের সাথে যদি আমরা কিছু আলাদা করতে পারি তবে নমুনা কোডটি দেখে আমাকে জানতে দিন
অমিত

1
এফওয়াইআই, জোদা-টাইম প্রকল্পটি এখন রক্ষণাবেক্ষণের মোডে রয়েছে , জাভা.টাইম ক্লাসগুলিতে মাইগ্রেশনের পরামর্শ দেয় । ওরাকল দ্বারা টিউটোরিয়াল দেখুন ।
তুলিল বাউরক

13

যদি মিলিসের মান 1 জানুয়ারী, 1970 সাল থেকে জিলিএমটির হিসাবে মিলির সংখ্যা হয়, যেমনটি জেভিএমের জন্য মান, তবে তা সময় অঞ্চল থেকে স্বতন্ত্র। আপনি যদি এটি নির্দিষ্ট সময় অঞ্চল দিয়ে ফর্ম্যাট করতে চান তবে আপনি এটিকে কেবল গ্রেগরিয়ানক্যালেন্ডার অবজেক্টে রূপান্তর করতে পারেন এবং সময় অঞ্চল নির্ধারণ করতে পারেন। এর পরে এটি ফর্ম্যাট করার জন্য অনেকগুলি উপায় রয়েছে।


1
এটি গ্রেগরিয়ানক্যালেন্ডার এবং জোদার সাথে নমুনা কোড, আমি জোদার সাথে সঠিক আউটপুট পাচ্ছি তবে গ্রেগরিয়ান গ্রেগরিয়ানক্যালেন্ডার ক্যালেন্ডারে নয় = নতুন গ্রেগরিয়ানক্যালেন্ডার (টাইমজোন.সেটটাইমজোন ("মার্কিন / কেন্দ্রীয়")); calendar.setTimeInMillis (yourmilliseconds); ডেটটাইম জোডাটাইম = নতুন ডেটটাইম (আপনার মিলিলিসেকেন্ডস, ডেটটাইমজোন.ফোরটাইমজোন (টাইমজোন.জেটটাইমজোন ("মার্কিন / কেন্দ্রীয়"))); ডেটটাইম ফরমেটার পার্সার 1 = ডেটটাইম ফরমেট.ফোর্ডার ("yyyy-MM-dd HH: মিমি: এসএস, এসএসএস");
অমিত

ক্যালেন্ডার অবজেক্টে সময় অঞ্চল নির্ধারণ কাজ করে না, তবে তারিখের বিন্যাসে এটি সেট করে?
বিল

ডেটটাইম এবং ডেটটাইম ফরমেটার কি ??
সুইটওয়িশার ツ

11

আমার সমাধান

public class CalendarUtils {

    public static String dateFormat = "dd-MM-yyyy hh:mm";
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);

    public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(Long.parseLong(milliSeconds));
        return simpleDateFormat.format(calendar.getTime());
    }
}

6

আমি এটি এইভাবে করি:

static String formatDate(long dateInMillis) {
    Date date = new Date(dateInMillis);
    return DateFormat.getDateInstance().format(date);
}

আপনি getDateInstance(int style)নিম্নলিখিত পরামিতিগুলি ব্যবহার করতে পারেন :

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT


5

সিম্পলডিটফর্ম্যাট ক্লাসে সেটটাইমজোন (টাইমজোন) নামে একটি পদ্ধতি রয়েছে যা ডেটফরম্যাট ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html


এফওয়াইআই, এই ভয়ঙ্কর ক্লাসগুলি এখন জেএসআর 310 গ্রহণের হিসাবে আধুনিক জাভা টাইম ক্লাস দ্বারা পরিবেশন করা হয়েছে
বাসিল


2

মিলিসেকেন্ড থেকে তারিখের ফর্ম্যাটে তারিখ পাওয়ার জন্য আমার নীচে সমাধান। এই কোডটি চালানোর জন্য আপনাকে জোডা লাইব্রেরি ব্যবহার করতে হবে।

import java.util.GregorianCalendar;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class time {

    public static void main(String args[]){

        String str = "1431601084000";
        long geTime= Long.parseLong(str);
        GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
        calendar.setTimeInMillis(geTime);
        DateTime jodaTime = new DateTime(geTime, 
               DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
        DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
        System.out.println("Get Time : "+parser1.print(jodaTime));

   }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.