Java में TimeStamp को Date में कैसे बदलें?


105

मैं 'टाइमस्टैम्प' को कैसे परिवर्तित करूं dateजावा में गिनती प्राप्त बाद मैं ?

मेरा वर्तमान कोड इस प्रकार है:

public class GetCurrentDateTime {

    public int data() {
        int count = 0;
        java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
        java.sql.Date date = new java.sql.Date(timeStamp.getTime()); 
        System.out.println(date);
        //count++;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");

            PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                // Do something with the row returned.
                count++; //if the first col is a count.
            }
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }

        return count;
    }
}

यह मेरा डेटाबेस है: यहां छवि विवरण दर्ज करें

यहां मुझे जो आउटपुट मिला वह 2012-08-07 0 था, लेकिन बराबर क्वेरी रिटर्न 3. मुझे 0 क्यों मिलता है?



क्या आप हमें उदाहरण दिखा सकते हैं कि तालिका डेटा कैसा दिखता है?
Oldrinb

दिनांक (1344255451,1344255537,1344312502) और स्थिति है (क्यू, क्यू, क्यू)
कृष्ण वेणी


इस प्रश्न का शीर्षक एक लाल हेरिंग है । वास्तविक समस्या PreparedStatementगलत सिंटैक्स के साथ अनुचित उपयोग है । आप अपने एसक्यूएल स्ट्रिंग के पाठ में जावा चर एम्बेड नहीं कर सकते। इसके बजाय, ?SQL स्ट्रिंग में एम्बेड करें, फिर setमानों को तैयार करने के लिए तरीकों को कॉल करें । सुजय द्वारा सही उत्तर और तेनसैक्स द्वारा उत्तर देखें
तुलसी बोर्क

जवाबों:


188

बस पैरामीटर के रूप Dateमें स्टैम्प के getTime()मूल्य के साथ एक नई वस्तु बनाएं ।

यहाँ एक उदाहरण है (मैं वर्तमान समय के एक उदाहरण टाइमस्टैम्प का उपयोग करता हूँ):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 आपको क्या लगता है कि यह पदावनत है? नवीनतम जावा 7 और 8 डॉक्स दोनों अन्यथा कहते हैं ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () और docs.oracle.com/javase/8-docs/api /java/util/Date.html#getTime-- )
एलेक्स कोलमैन

4
अगर टाइमस्टैम्प टाइम ज़ोन और JVM टाइमज़ोन अलग हैं, तो यह गलत परिणाम देगा।
रॉबर्ट मुगाटारोव

उदाहरण के लिए इस फॉर्मेट को 14.03.2014 को कैसे प्राप्त करें?
शूरोक

6
मुझे नफरत है जब पीपीएल अपने जवाबों में पुस्तकालयों का उपयोग करता है और सभी से अपेक्षा करता है कि वे उन्हें आयात करने का तरीका जानें: /
सोदज

38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();

आपने इसे 1000 से गुणा क्यों किया?
शरबत ५१२

3
बीकॉज की प्रारंभिक तिथि मिलीसेकंड में है और टाइमस्टैम्प सेकंड में है! अन्य सभी रूपांतरण के लिए एक ही सोचो! यह अच्छा है ?
विन्सेन्टलामूटे


7

मैं लंबे समय से इस की तलाश कर रहा था, पता चला है कि इपोश कनवर्टर इसे आसानी से करता है:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

या विपरीत:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));

6

tl; डॉ

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

...

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

...

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

...

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

java.time

आप पुरानी पुरानी तारीखों वाली कक्षाओं का उपयोग कर रहे हैं जो अब आधुनिक java.time द्वारा विरासत में ली गई हैं कक्षाओं हैं।

जाहिरा तौर पर आप अपने डेटाबेस में कुछ पूर्णांक प्रकार के कॉलम में एक क्षण का भंडारण कर रहे हैं। वह दुर्भाग्यपूर्ण है। इसके बजाय आपको SQL-standard जैसे किसी प्रकार के कॉलम का उपयोग करना चाहिए TIMESTAMP WITH TIME ZONE। लेकिन, इस उत्तर के लिए, हमारे पास जो भी है हम उसके साथ काम करेंगे।

यदि आपके रिकॉर्ड मिलीसेकंड के संकल्प के साथ क्षणों का प्रतिनिधित्व करते हैं, और आप पूरे दिन के लिए सभी रिकॉर्ड चाहते हैं, तो हमें समय सीमा की आवश्यकता है। हमारे पास एक शुरुआती पल और एक स्टॉप मोमेंट होना चाहिए। आपकी क्वेरी में केवल एक ही दिनांक-समय मानदंड है जहां इसे एक जोड़ी होना चाहिए था।

LocalDateवर्ग समय के दिन और समय क्षेत्र के बिना बिना एक दिनांक-केवल मूल्य का प्रतिनिधित्व करता।

एक तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि क्षेत्र के अनुसार दुनिया भर में भिन्न होती है। उदाहरण के लिए, पेरिस फ्रांस में मध्यरात्रि के कुछ मिनट बाद एक नया दिन है जबकि अभी भी "कल" मॉन्ट्रियल क्यूबेक में है

यदि कोई समय क्षेत्र निर्दिष्ट नहीं है, तो JVM अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र को स्पष्ट रूप से लागू करता है। वह डिफ़ॉल्ट किसी भी समय बदल सकता है, इसलिए आपके परिणाम भिन्न हो सकते हैं। एक तर्क के रूप में स्पष्ट रूप से अपने वांछित / अपेक्षित समय क्षेत्र को निर्दिष्ट करने के लिए बेहतर है।

के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

यदि आप जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र का उपयोग करना चाहते हैं, तो इसके लिए पूछें और एक तर्क के रूप में पास करें। यदि छोड़ा गया है, तो JVM के वर्तमान डिफ़ॉल्ट को अंतर्निहित रूप से लागू किया जाता है। स्पष्ट होने के लिए बेहतर है, क्योंकि JVM के भीतर किसी भी एप्लिकेशन के किसी भी धागे में किसी भी कोड द्वारा रनटाइम के दौरान किसी भी समय डिफ़ॉल्ट को बदला जा सकता है ।

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

या एक तिथि निर्दिष्ट करें। आप जनवरी-दिसंबर के लिए 1-12 नंबर की संख्या के साथ महीने को निर्धारित कर सकते हैं।

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

या, बेहतर, Monthवर्ष के प्रत्येक महीने के लिए पूर्व निर्धारित, एनम वस्तुओं का उपयोग करें । युक्ति: Monthअपने कोड को और अधिक स्व-दस्तावेजीकरण करने, मान्य मान सुनिश्चित करने और टाइप-सुरक्षा प्रदान करने के लिए केवल कोड संख्या के बजाय अपने कोडबेस में इन ऑब्जेक्ट्स का उपयोग करें ।

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

एक LocalDateहाथ से, हमें अगले क्षण की एक जोड़ी में बदलने की जरूरत है, दिन की शुरुआत और रोक। मान न लें कि दिन की शुरुआत 00:00:00 बजे से होती है। डेलाइट सेविंग टाइम (DST) जैसी विसंगतियों के कारण, दिन की शुरुआत किसी अन्य समय जैसे 01:00:00 से हो सकती है। तो java.time दिन के पहले क्षण को निर्धारित करते हैं। हम ऐसी किसी भी विसंगति को देखने के ZoneIdलिए एक तर्क देते LocalDate::atStartOfDayहैं। परिणाम एक है ZonedDateTime

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

आमतौर पर समय की अवधि को परिभाषित करने का सबसे अच्छा तरीका है, हाफ-ओपन दृष्टिकोण जहां शुरुआत है समावेशी है जबकि अंत अनन्य है । तो एक दिन अपने पहले क्षण के साथ शुरू होता है और अगले दिन के पहले क्षण तक शामिल नहीं होता है।

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

पूरे दिन के लिए हमारी क्वेरी SQL कमांड का उपयोग नहीं कर सकती है BETWEEN। यह कमांड पूरी तरह से बंद है ( []) (शुरुआत और अंत दोनों समावेशी हैं) जहां हम हाफ-ओपन ( [)) चाहते हैं। हम मापदंड की एक जोड़ी का उपयोग करते हैं >=और <

आपके कॉलम का नाम खराब है। विभिन्न डेटाबेस द्वारा आरक्षित हजार शब्दों में से किसी से बचें। आइए placedइस उदाहरण में उपयोग करें।

आपके कोड का उपयोग किया जाना चाहिए ? में प्लेसहोल्डर का जिसमें हमारे क्षणों को निर्दिष्ट करना है।

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

लेकिन हमारे पास है ZonedDateTime हाथ में वस्तुएं हैं, जबकि आपका डेटाबेस जाहिरा तौर पर पूर्णांक को संग्रहीत कर रहा है जैसा कि ऊपर चर्चा की गई है। यदि आपने अपने कॉलम को ठीक से परिभाषित किया था तो हम बस ZonedDateTimeJDBC 4.2 या उसके बाद वाले किसी भी JDBC ड्राइवर के साथ ऑब्जेक्ट पास कर सकते हैं ।

लेकिन इसके बजाय हमें पूरे सेकंड में एक गिनती-से-युग प्राप्त करने की आवश्यकता है। मुझे लगता है कि यूटीसी में 1970 की पहली तारीख आपके लिए संदर्भ की तारीख होगी। डेटा हानि से सावधान रहें, जैसा किZonedDateTime कक्षा नैनोसेकंड रिज़ॉल्यूशन में सक्षम है। किसी भी भिन्नात्मक दूसरे को निम्न पंक्तियों में काट दिया जाएगा।

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

अब हम उन पूर्णांकों को हमारे एसक्यूएल कोड से ऊपर पारित करने के लिए तैयार हैं।

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

जब आप अपने पूर्णांक मानों को पुनः प्राप्त करते हैं ResultSet, तो आप Instantऑब्जेक्ट्स (हमेशा यूटीसी में), या ZonedDateTimeऑब्जेक्ट्स (एक निर्दिष्ट क्षेत्र के साथ) में बदल सकते हैं।

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, औरSimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , के लिए प्रवास की सलाह है java.time कक्षाएं।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


4

सबसे पहले, आप का उपयोग कर के लाभ का लाभ नहीं उठा रहे हैं PreparedStatement। मैं सबसे पहले आपको सुझाव दूंगा कि आप अपना संशोधन PreparedStatementइस प्रकार करें:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

फिर आप statement.setXX(param_index, param_value)संबंधित मान सेट करने के लिए उपयोग कर सकते हैं। रूपांतरण के लिए timestamp, निम्नलिखित javadocs पर एक नज़र डालें:

रेडीस्टेडमेंट.सेटटाइमस्टैम्प ()
टाइमस्टैम्प

उम्मीद है की यह मदद करेगा!


4

एंड्रॉइड में इसका बहुत ही सरल है। बस वर्तमान समय के लिए कैलेंडर क्लास का उपयोग करें।

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

जावा में वर्तमान टाइमस्टैम्प प्राप्त करने के लिए केवल System.currentTimeMillis () का उपयोग करें


3

सुनिश्चित करें कि आप क्वेरी में चयन करने का प्रयास कर रहे हैं, लेकिन ध्यान रखें कि UNIX_TIMESTAMP()बिना तर्क के अब समय वापस आता है। आपको संभवतः तर्क के रूप में एक मान्य समय प्रदान करना चाहिए, या स्थिति को बदलना चाहिए।

संपादित करें:

यहाँ प्रश्न पर आधारित समयबद्ध क्वेरी का एक उदाहरण दिया गया है:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

संपादित करें: टाइमस्टैम्प कॉलम

टाइमस्टैम्प के उपयोग java.sql.Timestampऔर रेडीस्टेटमेंट.सेटटीमस्टैम्प () , के मामले में :

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);

। अब मेरी हालत xcart_orders से चुनें * जहां स्थिति = 'क्यू' और दिनांक = CURDATE () अब भी शून्य दर्शाए गए है
कृष्णा वेणी

@krishnaveni आप किन रिकॉर्ड्स को चुनने की कोशिश कर रहे हैं?
टेनोरेक्स

दिनांक (11111111,123456767,122333344) और स्थिति = (क्यू, क्यू, क्यू) .. सभी मेरे डेटाबेस में सहेजे गए हैं। मुझे क्वेरी की जाँच करने और मेरे कंसोल पर गिनती मूल्य और प्रदर्शन प्राप्त करने की आवश्यकता है (यानी कितने हैं) गणना मान लौटने के बाद डेटा का मिलान किया जाता है
कृष्ण वेणी

@krishnaveni यदि आप चाहते हैं कि परिणाम एक निश्चित तारीख से बंधे हों, तो क्वेरी में उस तिथि का उपयोग करें, अन्यथा तारीख की शर्त को हटा दें।
टेनोरेक्स

जब मेरे डेटाबेस में सहेजा गया yyyy-mm-dd प्रारूप में है, तो मेरे कोड में सफलतापूर्वक काम करता है। लेकिन अब इस 1343469690 प्रारूप में टाइमस्टैम्प में मेरी तारीख बच गई है। गणना मूल्य कैसे प्राप्त किया जाता है? मैंने यहां एक कोड कैसे लिखा है
कृष्ण वेणी

3

new Date(timestamp.getTime())काम करना चाहिए, लेकिन नए फैंसी जावा 8 तरीके (जो अधिक सुरुचिपूर्ण और अधिक प्रकार के सुरक्षित हो सकते हैं, साथ ही आपको नए समय वर्गों का उपयोग करने के लिए नेतृत्व करने में मदद करते हैं) को कॉल करना है Date.from(timestamp.toInstant())

(इस तथ्य पर भरोसा न करें कि Timestampस्वयं एक उदाहरण है Date; किसी अन्य उत्तर की टिप्पणियों में स्पष्टीकरण देखें ।)



3

मैं जवाब देने के लिए बाध्य महसूस करता हूं क्योंकि अन्य उत्तर समय क्षेत्र अज्ञेय प्रतीत होते हैं जो एक वास्तविक विश्व अनुप्रयोग होने का जोखिम नहीं उठा सकता है। टाइमस्टैम्प-टू-डेट रूपांतरण को सही बनाने के लिए जब टाइमस्टैम्प और जेवीएम अलग-अलग समय क्षेत्रों का उपयोग कर रहे हैं, तो आप इस तरह से Joda Time's LocalDateTime (या Java8 में LocalDateTime) का उपयोग कर सकते हैं:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

नीचे दिया गया उदाहरण मानता है कि टाइमस्टैम्प UTC है (जैसा कि आमतौर पर डेटाबेस में होता है)। यदि आपका टाइमस्टैम्प अलग समय-क्षेत्र में है, तो toDateकथन का समय-क्षेत्र पैरामीटर बदलें ।


2

इस जावा कोड का उपयोग करने का प्रयास करें:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);

0

यह मानते हुए कि आपके पास पहले से मौजूद है java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );

0

आप टाइमस्टैम्प और विशेष क्षेत्र के टाइम-ज़ोन से दिनांक प्राप्त करने के लिए इस पद्धति का उपयोग कर सकते हैं।

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.