জেপিএ এবং হাইবারনেটের সাথে ইউটিসি টাইম জোনে তারিখ / সময় এবং টাইমস্ট্যাম্পগুলি কীভাবে সংরক্ষণ করবেন


106

ইউটিসি (জিএমটি) সময় অঞ্চল হিসাবে ডেটাবেজে একটি তারিখ / সময় সঞ্চয় করতে আমি কীভাবে জেপিএ / হাইবারনেটকে কনফিগার করতে পারি? এই টীকাযুক্ত জেপিএ সত্তা বিবেচনা করুন:

public class Event {
    @Id
    public int id;

    @Temporal(TemporalType.TIMESTAMP)
    public java.util.Date date;
}

তারিখটি যদি ২০০৮-ফেব্রুয়ারী -03 সকাল 9:30 am প্যাসিফিক স্ট্যান্ডার্ড সময় (পিএসটি) হয়, তবে আমি ২০০৮-ফেব্রুয়ারী -২০১৮ সন্ধ্যা :30:৩০ এর ইউটিসি সময়টি ডাটাবেসে সঞ্চিত রাখতে চাই। তেমনিভাবে, যখন তারিখটি ডাটাবেস থেকে পুনরুদ্ধার করা হয়, আমি এটি ইউটিসি হিসাবে ব্যাখ্যা করতে চাই। সুতরাং এই ক্ষেত্রে 530 বিকাল 530 অপরাহ্ন ইউটিসি। এটি প্রদর্শিত হলে এটি সকাল 9:30 পিএসটি হিসাবে ফর্ম্যাট হবে।


1
ভ্লাদ মিহলসিয়া এর উত্তর একটি আপডেট উত্তর সরবরাহ করে (হাইবারনেট 5.2+ এর জন্য)
ডাইনাই

উত্তর:


73

হাইবারনেট 5.2 এর সাহায্যে আপনি নিম্নলিখিত কনফিগারেশন সম্পত্তিটি ব্যবহার করে ইউটিসি সময় অঞ্চলকে জোর করতে পারেন:

<property name="hibernate.jdbc.time_zone" value="UTC"/>

আরও বিশদের জন্য এই নিবন্ধটি দেখুন


19
আমি এটিও লিখেছিলাম: ডি এখন, অনুমান করুন যে হাইবারনেটে এই বৈশিষ্ট্যটির জন্য কে সমর্থন যোগ করেছেন?
ভ্লাদ মিহলছিয়া

ওহ, এখনই আমি বুঝতে পেরেছি যে আপনার প্রোফাইল এবং সেই নিবন্ধগুলিতে নাম এবং ছবি একই ... গুড জব ভ্লাদ :)
ডাইনি

@ ভ্লাদমিহালসিয়া যদি এটি মাইকিউএল এর হয় তবে মাইএসকিএলকে useTimezone=trueসংযোগের স্ট্রিং ব্যবহার করে টাইমজোন ব্যবহার করতে বলা উচিত । তারপরে কেবল সম্পত্তি সেট করার hibernate.jdbc.time_zoneকাজ করবে
TheCoder

আসলে, আপনাকে useLegacyDatetimeCodeমিথ্যাতে সেট করতে হবে
ভ্লাদ মিহালসিয়া

2
হাইবারনেট.জেডিবিসি.টাইম_জোন পোস্টগ্র্রেএসকিউএল
অ্যালেক্স আর

48

আমার জ্ঞানের সর্বোপরি, আপনার নিজের পুরো জাভা অ্যাপটি ইউটিসি টাইমজোনে স্থাপন করা দরকার (যাতে হাইবারনেট ইউটিসি-তে তারিখগুলি সঞ্চয় করে রাখে) এবং আপনি যখন স্টাফ প্রদর্শন করবেন তখন যে কোনও টাইমজোন পছন্দসই রূপান্তর করতে হবে (কমপক্ষে আমরা এটি করব) এই পথে).

প্রারম্ভকালে, আমরা এটি করি:

TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));

এবং পছন্দসই টাইমজোনটি তারিখফর্ম্যাটটিতে সেট করুন:

fmt.setTimeZone(TimeZone.getTimeZone("Europe/Budapest"))

5
মিচনুল, আপনার সমাধানটি সব ক্ষেত্রে কার্যকর হবে না কারণ হাইবারনেট প্রতিনিধিরা জেডিবিসি ড্রাইভারের তারিখ নির্ধারণ করে এবং প্রতিটি জেডিবিসি ড্রাইভার পৃথকভাবে তারিখ এবং সময় অঞ্চল পরিচালনা করে। দেখতে stackoverflow.com/questions/4123534/...
ডেরেক মাহর

2
তবে আমি যদি আমার অ্যাপ্লিকেশনটি JVM "-Duser.Timezone = + 00: 00" সম্পত্তিটি অবহিত করতে শুরু করি তবে কি একই আচরণ হয় না?
rafa.ferreira

8
যতদূর আমি বলতে পারি, এটি জেভিএম এবং ডাটাবেস সার্ভার বিভিন্ন টাইম জোনে থাকা ব্যতীত অন্য সকল ক্ষেত্রে কাজ করবে।
শেন

stevekuo এবং @mitchnull divestoclimb সমাধান দেখতে যার নীচে অনেক বেশী উত্তম এবং পার্শ্ব প্রতিক্রিয়া প্রমাণ stackoverflow.com/a/3430957/233906
Cerber

হাইবারনেটজেপিএ কি "@ ফ্যাক্টরি" এবং "@ এক্সটার্নালাইজার" টীকা সমর্থন করে, আমি কীভাবে ওপেনজেপিএ লাইব্রেরিতে ডেটটাইম ইউটিসি পরিচালনা করি। stackoverflow.com/questions/10819862/...
আপনারা কে কে

44

হাইবারনেট তারিখগুলিতে টাইম জোনের স্টাফগুলি সম্পর্কে অজ্ঞ (কারণ কোনও কিছুই নেই) তবে এটি আসলে জেডিবিসি স্তর যা সমস্যার সৃষ্টি করে। ResultSet.getTimestampএবং PreparedStatement.setTimestampউভয়ই তাদের ডক্সে বলে থাকেন যে তারা ডাটাবেস থেকে / পড়ার সময় এবং লেখার সময় ডিফল্ট অনুসারে বর্তমান জেভিএম টাইমজোন থেকে / তারিখকে রূপান্তর করে।

আমি হাইবারনেট ৩.৫ এ সাবক্ল্যাসিং করে একটি সমাধান নিয়ে এসেছি org.hibernate.type.TimestampTypeযা এই জেডিবিসি পদ্ধতিগুলিকে স্থানীয় সময় অঞ্চলের পরিবর্তে ইউটিসি ব্যবহার করতে বাধ্য করে:

public class UtcTimestampType extends TimestampType {

    private static final long serialVersionUID = 8088663383676984635L;

    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    @Override
    public Object get(ResultSet rs, String name) throws SQLException {
        return rs.getTimestamp(name, Calendar.getInstance(UTC));
    }

    @Override
    public void set(PreparedStatement st, Object value, int index) throws SQLException {
        Timestamp ts;
        if(value instanceof Timestamp) {
            ts = (Timestamp) value;
        } else {
            ts = new Timestamp(((java.util.Date) value).getTime());
        }
        st.setTimestamp(index, ts, Calendar.getInstance(UTC));
    }
}

টাইমটাইপ এবং ডেটটাইপ ঠিক করার জন্য একই জিনিসটি করা উচিত যদি আপনি এই ধরণের ব্যবহার করেন। খারাপ দিকটি হ'ল আপনাকে ম্যানুয়ালি উল্লেখ করতে হবে যে আপনার POJOs (এবং খাঁটি জেপিএ সামঞ্জস্যতাও ভেঙে দেয়) প্রতি তারিখের ক্ষেত্রে ডিফল্টগুলির পরিবর্তে এই ধরণেরগুলি ব্যবহার করতে হবে, যদি না কেউ আরও সাধারণ ওভাররাইড পদ্ধতি সম্পর্কে জানেন।

আপডেট: হাইবারনেট 3.6 ধরণের API পরিবর্তন করেছে। ৩. In-তে, আমি এটি প্রয়োগের জন্য একটি ক্লাস উত্সটাইমস্ট্যাম্পটাইপডেস্কিটার লিখেছি।

public class UtcTimestampTypeDescriptor extends TimestampTypeDescriptor {
    public static final UtcTimestampTypeDescriptor INSTANCE = new UtcTimestampTypeDescriptor();

    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicBinder<X>( javaTypeDescriptor, this ) {
            @Override
            protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
                st.setTimestamp( index, javaTypeDescriptor.unwrap( value, Timestamp.class, options ), Calendar.getInstance(UTC) );
            }
        };
    }

    public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicExtractor<X>( javaTypeDescriptor, this ) {
            @Override
            protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap( rs.getTimestamp( name, Calendar.getInstance(UTC) ), options );
            }
        };
    }
}

এখন যখন অ্যাপটি শুরু হবে, আপনি যদি টাইমস্ট্যাম্পটাইপডেস্ক্রিপ্টর সেট করেন IN INSTANCETTTimestampTypeDescriptor এর একটি উদাহরণে, সমস্ত টাইমস্ট্যাম্পগুলি POJOs এ টীকা পরিবর্তন না করে UTC তে থাকার হিসাবে সংরক্ষণ করা হবে। [আমি এখনও এটি পরীক্ষা করিনি]


3
আপনি কীভাবে হাইবারনেটকে আপনার কাস্টমটি ব্যবহার করতে বলছেন UtcTimestampType?
ডেরেক মাহর

ডাইভস্টোক্লেম, হাইবারনেটের কোন সংস্করণটির সাথে UtcTimestampTypeসামঞ্জস্য রয়েছে?
ডেরেক মহর

2
"রেজাল্টসেট.সেটটাইমস্ট্যাম্প এবং প্রিপেইড স্টেটমেন্ট.সেটটাইমস্ট্যাম্প উভয়ই তাদের ডক্সে বলে যে তারা ডাটাবেস থেকে / পড়ার সময় এবং লেখার সময় ডিফল্টরূপে বর্তমান জেভিএম টাইমজোন থেকে / তারিখকে রূপান্তর করে।" আপনার কি রেফারেন্স আছে? আমি এই পদ্ধতির জন্য জাভা 6 জাভাদোকগুলিতে এর কোনও উল্লেখ দেখতে পাচ্ছি না। স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৪১২৩৩৩৩/২ অনুসারে , কীভাবে এই পদ্ধতিগুলি প্রদত্ত সময়গুলিতে সময় অঞ্চল প্রয়োগ করে DateবাTimestamp জেডিবিসি ড্রাইভার নির্ভর।
ডেরেক মাহর

1
আমি শপথ করে বলতে পারি যে গত বছর জেভিএম টাইমজোনটি ব্যবহার করার বিষয়ে, তবে এখন এটি খুঁজে পাচ্ছি না। আমি সুনির্দিষ্ট জেডিবিসি ড্রাইভারের জন্য ডক্সে এটি পেয়েছি এবং সাধারণীকরণ করেছি।
ডাইভস্টোক ক্লম্ব

2
কাজ করার জন্য আপনার উদাহরণের 3.6 সংস্করণটি পেতে আমাকে একটি নতুন টাইপ তৈরি করতে হয়েছিল যা মূলত টাইমস্ট্যাম্পটাইপের চারপাশে একটি মোড়ক ছিল এবং তারপরে ক্ষেত্রের মধ্যে টাইপটি সেট করে।
শান স্টোন

17

স্প্রিং বুট জেপিএর সাহায্যে আপনার অ্যাপ্লিকেশন p প্রপার্টি ফাইলে নীচের কোডটি ব্যবহার করুন এবং স্পষ্টতই আপনি আপনার পছন্দ অনুযায়ী সময় অঞ্চল পরিবর্তন করতে পারেন

spring.jpa.properties.hibernate.jdbc.time_zone = UTC

তারপরে আপনার সত্তা শ্রেণীর ফাইলে,

@Column
private LocalDateTime created;

11

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

এটি হাইবারনেট ৪.১.৪ ব্যবহার করছে F ফাইনাল, যদিও আমি সন্দেহ করি যে ৩. after এর পরে কিছু কাজ করবে।

প্রথমে ডাইভস্টোক্লেম এর ইউটিটাইমস্ট্যাম্পটাইপডিজিপেক্টর তৈরি করুন

public class UtcTimestampTypeDescriptor extends TimestampTypeDescriptor {
    public static final UtcTimestampTypeDescriptor INSTANCE = new UtcTimestampTypeDescriptor();

    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicBinder<X>( javaTypeDescriptor, this ) {
            @Override
            protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
                st.setTimestamp( index, javaTypeDescriptor.unwrap( value, Timestamp.class, options ), Calendar.getInstance(UTC) );
            }
        };
    }

    public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicExtractor<X>( javaTypeDescriptor, this ) {
            @Override
            protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap( rs.getTimestamp( name, Calendar.getInstance(UTC) ), options );
            }
        };
    }
}

তারপরে উত্সটাইমস্ট্যাম্পটাইপ তৈরি করুন, যা সুপার কনস্ট্রাক্টর কলটিতে স্কেলটাইপডেস্ক্রিপ্টরের পরিবর্তে টাইমস্ট্যাম্পটাইপডেস্ক্রিপ্টরের পরিবর্তে উত্সটাইমস্ট্যাম্পটাইপডেস্কিপ্টার ব্যবহার করে তবে অন্যথায় সমস্ত কিছু টাইমস্ট্যাম্পটাইপকে অর্পণ করে:

public class UtcTimestampType
        extends AbstractSingleColumnStandardBasicType<Date>
        implements VersionType<Date>, LiteralType<Date> {
    public static final UtcTimestampType INSTANCE = new UtcTimestampType();

    public UtcTimestampType() {
        super( UtcTimestampTypeDescriptor.INSTANCE, JdbcTimestampTypeDescriptor.INSTANCE );
    }

    public String getName() {
        return TimestampType.INSTANCE.getName();
    }

    @Override
    public String[] getRegistrationKeys() {
        return TimestampType.INSTANCE.getRegistrationKeys();
    }

    public Date next(Date current, SessionImplementor session) {
        return TimestampType.INSTANCE.next(current, session);
    }

    public Date seed(SessionImplementor session) {
        return TimestampType.INSTANCE.seed(session);
    }

    public Comparator<Date> getComparator() {
        return TimestampType.INSTANCE.getComparator();        
    }

    public String objectToSQLString(Date value, Dialect dialect) throws Exception {
        return TimestampType.INSTANCE.objectToSQLString(value, dialect);
    }

    public Date fromStringValue(String xml) throws HibernateException {
        return TimestampType.INSTANCE.fromStringValue(xml);
    }
}

অবশেষে, আপনি যখন হাইবারনেট কনফিগারেশনটি আরম্ভ করবেন, তখন টাইপ ওভাররাইড হিসাবে উত্সটাইমস্ট্যাম্পটাইপটি নিবন্ধ করুন:

configuration.registerTypeOverride(new UtcTimestampType());

এখন টাইমস্ট্যাম্পগুলি JVM এর সময় অঞ্চলের সাথে ডেটাবেসগুলিতে এবং তাদের পথে যাওয়া উচিত নয়। আছে HTH।


6
জেপিএ এবং স্প্রিং কনফিগারেশনের সমাধানটি দেখতে দুর্দান্ত লাগবে।
আবার্গিন

2
হাইবারনেটের মধ্যে দেশীয় প্রশ্নের সাথে এই পদ্ধতির ব্যবহার সম্পর্কিত একটি নোট। এই ওভাররাইড হওয়া প্রকারগুলি ব্যবহার করার জন্য আপনাকে ক্যোয়ার.সেটপ্যারামিটারের সাথে মান নির্ধারণ করতে হবে (int পোজ, অবজেক্ট মান), ক্যোয়ারি.সেটপ্যারামিটার নয় (int পোজ, তারিখের মান, টেম্পোরাল টাইপ টেম্পোরাল টাইপ)। আপনি যদি পরবর্তীটি ব্যবহার করেন তবে হাইবারনেট তার মূল ধরণের প্রয়োগগুলি ব্যবহার করবে, কারণ সেগুলি হার্ড কোডেড।
নাইজেল

আমি যেখানে স্টেটমেন্ট কনফিগারেশনকে কল করব reg রেজিস্টারটাইপ ওভাররাইড (নতুন ইউটটাইমস্ট্যাম্পটাইপ ()); ?
স্টনি

@ স্টটনি যেখানেই আপনি আপনার হাইবারনেট কনফিগারেশন শুরু করুন। আপনার যদি হাইবারনেট ইউটিল থাকে (বেশিরভাগ করুন) তবে এটি সেখানে থাকবে।
শেন

1
এটি কাজ করে, তবে এটি যাচাই করার পরে আমি বুঝতে পেরেছিলাম যে পোস্টগ্রিজ সার্ভারের জন্য টাইমজোন = "ইউটিসি" এবং সমস্ত ডিফল্ট ধরণের টাইমস্ট্যাম্পগুলির সাথে "টাইমস্ট্যাম্প উইথ টাইমস্ট্যাম্প" (এটি তখন স্বয়ংক্রিয়ভাবে সম্পন্ন হবে) কাজ করে না। তবে, এখানে হাইবারনেট ৪.৩.৫ জিএ-র সম্পূর্ণ একক শ্রেণি হিসাবে এবং ওভারড্রিডিং স্প্রিং ফ্যাক্টরি শিমের পেস্টবিন.
com/tT4ACXn6

10

আপনি ভাববেন যে এই সাধারণ সমস্যাটি হাইবারনেট দ্বারা যত্ন নেওয়া হবে। কিন্তু এটা না! এটি সঠিকভাবে পেতে কয়েকটি "হ্যাকস" রয়েছে।

আমি যেটি ব্যবহার করি তা হ'ল ডেটাবেজে লং হিসাবে তারিখ সংরক্ষণ করা। সুতরাং আমি সর্বদা 1/1/70 এর পরে মিলিসেকেন্ডের সাথে কাজ করছি। আমার ক্লাসে গেটার্স এবং সেটটার রয়েছে যা কেবলমাত্র তারিখগুলি ফেরত / গ্রহণ করে। সুতরাং এপিআই একই থাকে। নীচের দিকটি হ'ল ডাটাবেসে আমার দীর্ঘস্থায়ী। এসকিউএল সহ তাই আমি কেবল <,>, = তুলনা করতে পারি - অভিনব তারিখ অপারেটরগুলি না।

এখানে বর্ণিত হিসাবে কাস্টম ম্যাপিং টাইপের ব্যবহারকারীর কাছে আরেকটি পদ্ধতি হ'ল: http://www.hibernate.org/100.html

আমি মনে করি এর সাথে ডিল করার সঠিক উপায়টি যদিও কোনও তারিখের পরিবর্তে একটি ক্যালেন্ডার ব্যবহার করা। ক্যালেন্ডারের সাহায্যে আপনি অধ্যবসায়ের আগে সময় অঞ্চল নির্ধারণ করতে পারেন।

দ্রষ্টব্য: মূ .় স্ট্যাকওভারফ্লো আমাকে মন্তব্য করতে দেবে না, সুতরাং ডেভিড এ-এর প্রতিক্রিয়া এখানে।

আপনি যদি শিকাগোতে এই বস্তুটি তৈরি করেন:

new Date(0);

হাইবারনেট এটিকে "12/31/1969 18:00:00" হিসাবে ধরে রাখে। তারিখগুলি সময় অঞ্চল ছাড়াই উচিত, সুতরাং কেন সামঞ্জস্য করা হবে তা নিশ্চিত not


1
নিজের প্রতি লজ্জা! আপনি ঠিক ছিলেন এবং আপনার পোস্টের লিঙ্কটি এটি ভালভাবে ব্যাখ্যা করেছে। এখন আমি অনুমান করি আমার উত্তরটি কিছু নেতিবাচক খ্যাতির দাবিদার :)
ডেভিড এ।

1
একেবারেই না. আপনি কেন আমাকে এই সমস্যা হিসাবে খুব স্পষ্ট উদাহরণ পোস্ট করতে উত্সাহিত করেছিলেন।
কোডফিংগার

4
আমি ক্যালেন্ডার অবজেক্টটি ব্যবহার করে সময়কে সঠিকভাবে চালিয়ে যেতে সক্ষম হয়েছি যাতে তারা আপনার পরামর্শ অনুসারে ইউটিসি হিসাবে ডিবিতে সঞ্চিত থাকে। যাইহোক, যখন ডাটাবেস থেকে অস্তিত্বের অস্তিত্বগুলি পড়া যায় তখন হাইবারনেট ধরে নেয় যে তারা স্থানীয় সময় অঞ্চলে এবং ক্যালেন্ডার অবজেক্টটি ভুল!
জন কে

1
জন কে, এই Calendarপড়ার সমস্যাটি সমাধান করার জন্য , আমি মনে করি যে প্রতিটি ম্যাপিংয়ের জন্য হাইবারনেট বা TIMESTAMPকলামে যে তারিখটি পড়ে এবং লেখায় সে তারিখটি অনুবাদ করতে হবে এমন প্রতিটি অঞ্চল ম্যাপিংয়ের জন্য হাইবারনেট বা জেপিএর কিছু নির্দিষ্ট করার উপায় সরবরাহ করা উচিত ।
ডেরেক মাহর

joekutner, পড়ার পর stackoverflow.com/questions/4123534/... , আমি আপনার মতামত যে আমরা বরং একটি তুলনায় ডাটাবেসের মধ্যে পর্ব থেকে মিলিসেকেন্ড সংরক্ষণ করা উচিত শেয়ার করতে এসেছ Timestampযেহেতু আমরা অগত্যা যেমন দোকান তারিখ JDBC ড্রাইভার বিশ্বাস করতে পারি না আমরা আশা করব
ডেরেক মাহর

8

এখানে বেশ কয়েকটি সময় অঞ্চল চালু রয়েছে:

  1. জাভার ডেট ক্লাস (ইউজ এবং স্কয়ার), যা ইউটিসির অন্তর্নিহিত সময় অঞ্চল রয়েছে
  2. আপনার জেভিএমের সময় অঞ্চলটি চালু আছে এবং
  3. আপনার ডাটাবেস সার্ভারের ডিফল্ট সময় অঞ্চল।

এই সব বিভিন্ন হতে পারে। হাইবারনেট / জেপিএর একটি ডিজাইনের তীব্র ঘাটতি রয়েছে যে কোনও ব্যবহারকারী সহজেই তা নিশ্চিত করতে পারে না যে ডাটাবেস সার্ভারে টাইমজোন তথ্য সংরক্ষণ করা হয়েছে (যা জেভিএম-তে সঠিক সময় এবং তারিখগুলির পুনর্নির্মাণের অনুমতি দেয়)।

জেপিএ / হাইবারনেট ব্যবহার করে টাইমজোনটি (সহজেই) সঞ্চয় করার ক্ষমতা ছাড়াই তথ্য হারিয়ে যায় এবং তথ্য একবার হারিয়ে গেলে এটি নির্মাণ করা ব্যয়বহুল হয়ে যায় (যদি সম্ভব হয় তবে)।

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

দুঃখিত, এই পোস্টটি একটি পরিশ্রমের জোগান দেয় না (এর উত্তর অন্যত্র দেওয়া হয়েছে) তবে কেন সর্বদা সময় অঞ্চল তথ্য সংরক্ষণ করা গুরুত্বপূর্ণ তা একটি যুক্তিযুক্ত। দুর্ভাগ্যক্রমে মনে হয় অনেক কম্পিউটার বিজ্ঞানী এবং প্রোগ্রামিং প্র্যাকটিশনাররা টাইমজোনগুলির প্রয়োজনীয়তার বিরুদ্ধে তর্ক করেন কারণ তারা "তথ্য হ্রাস" দৃষ্টিভঙ্গিটির প্রশংসা করেন না এবং কীভাবে এটি আন্তর্জাতিকীকরণের মতো জিনিসগুলিকে খুব কঠিন করে তোলে - যা আজকাল ওয়েব সাইটগুলির মাধ্যমে অ্যাক্সেসযোগ্য খুব গুরুত্বপূর্ণ is ক্লায়েন্ট এবং আপনার সংস্থার লোকেরা যখন তারা বিশ্বজুড়ে চলাফেরা করে।


1
"হাইবারনেট / জেপিএর একটি মারাত্মক নকশার ঘাটতি রয়েছে" আমি বলব এটি এসকিউএল-এর একটি ঘাটতি, যা traditionতিহ্যগতভাবে সময়-অঞ্চলকে অন্তর্নিহিত করার অনুমতি দিয়েছে, এবং এর ফলে সম্ভাব্য কিছু আছে। নিরীহ এসকিউএল।
রায়েডওয়াল্ড

3
প্রকৃতপক্ষে, টাইমজোনকে সর্বদা স্টোরেজ করার পরিবর্তে, আপনি একটি টাইমজোনকে (সাধারণত ইউটিসি) মানকও করতে পারেন এবং অবিরাম থাকার সময় (এবং পড়ার সময় ফিরে আসার সময়) সমস্ত কিছুকে এই টাইমজোনতে রূপান্তর করতে পারেন। আমরা সাধারণত এটি করি। তবে, জেডিবিসি সরাসরি তা সমর্থন করে না: - /।
সলেসকে

3

সোর্সফোজে আমার প্রকল্পটি দেখুন যা স্ট্যান্ডার্ড এসকিউএল তারিখ এবং সময় ধরণের পাশাপাশি জেএসআর 310 এবং জোদা সময়ের জন্য ব্যবহারকারীর ধরন রয়েছে। সমস্ত প্রকারের অফসেটিং সমস্যাটি সমাধান করার চেষ্টা করে। Http://sourceforge.net/projects/usertype/ দেখুন

সম্পাদনা: ডেরেক মহর এর প্রশ্নের জবাবে এই মন্তব্যের সাথে যুক্ত:

"ক্রিস, আপনার ব্যবহারকারীর ধরনগুলি কি হাইবারনেট 3 বা ততোধিকের সাথে কাজ করে? - ডেরেক মহর 7 নভেম্বর 10 '12:30 এ"

হ্যাঁ এই ধরণের হাইবারনেট 3.6 সহ হাইবারনেট 3.x সংস্করণ সমর্থন করে।


2

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

গুরুতর হওয়ার উদ্দেশ্যে হাইবারনেট হবে ম্যাপিং কিছু ফর্ম মধ্যে বলা অনুমতি করা হচ্ছে যে ডিবি তারিখ যে যখন এটি লোড বা দোকান এটা এটা নিজস্ব গ্রহণ করে না এমন-এবং-এমন সময় অঞ্চল রয়েছে তাই ...


1

আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি যখন আমি ডিবিতে তারিখগুলি ইউটিসি হিসাবে সংরক্ষণ করতে varcharএবং স্পষ্ট String <-> java.util.Dateরূপান্তরগুলি ব্যবহার করা বা ইউটিসি টাইম জোনে আমার পুরো জাভা অ্যাপ্লিকেশনটি সেট করা এড়াতে চাইতাম (কারণ এটি যদি জেভিএম হয় তবে অন্য অপ্রত্যাশিত সমস্যার কারণ হতে পারে) অনেক অ্যাপ্লিকেশন জুড়ে ভাগ)।

সুতরাং, একটি ওপেন সোর্স প্রকল্প রয়েছে DbAssist, যা আপনাকে ডাটাবেস থেকে সহজেই ইউটিসি তারিখ হিসাবে পঠন / লেখার সমাধান করতে দেয়। যেহেতু আপনি সত্তার ক্ষেত্রগুলি মানচিত্রের জন্য জেপিএ টিকা ব্যবহার করছেন, আপনাকে যা করতে হবে তা হল আপনার মাভেন pomফাইলে নিম্নলিখিত নির্ভরতা অন্তর্ভুক্ত করা :

<dependency>
    <groupId>com.montrosesoftware</groupId>
    <artifactId>DbAssist-5.2.2</artifactId>
    <version>1.0-RELEASE</version>
</dependency>

তারপরে আপনি @EnableAutoConfigurationস্প্রিং অ্যাপ্লিকেশন ক্লাসের আগে টীকা যুক্ত করে (হাইবারনেট + স্প্রিং বুটের উদাহরণের জন্য) সমাধানটি প্রয়োগ করুন। অন্যান্য সেটআপগুলির জন্য ইনস্টলেশন নির্দেশাবলী এবং আরও ব্যবহারের উদাহরণগুলির জন্য, কেবলমাত্র প্রকল্পের গিথুব দেখুন

ভাল জিনিস হ'ল আপনাকে সত্তাগুলিকে মোটেও পরিবর্তন করতে হবে না; আপনি তাদের java.util.Dateক্ষেত্রগুলি যেমন আছে তেমন ছেড়ে যেতে পারেন ।

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

অভ্যন্তরীণভাবে, কোনও কাস্টম তৈরি করতে ফিক্সটি ডাইভস্টোক্লেব, শেন এবং অন্যান্য কয়েকটি উত্স থেকে ইঙ্গিত ব্যবহার করে UtcDateType। তারপরে এটি java.util.Dateকাস্টমটির সাথে মানকটি মানচিত্র করে UtcDateTypeযা সমস্ত প্রয়োজনীয় সময় অঞ্চল হ্যান্ডলিং পরিচালনা করে। প্রকারকৃত ফাইলগুলিতে @Typedefটীকাগুলি ব্যবহার করে ধরণের ম্যাপিং অর্জন করা হয় package-info.java

@TypeDef(name = "UtcDateType", defaultForType = Date.class, typeClass = UtcDateType.class),
package com.montrosesoftware.dbassist.types;

আপনি এখানে একটি নিবন্ধ সন্ধান করতে পারেন যা কেন এমন টাইম শিফট আদৌ ঘটে এবং এর সমাধানের উপায়গুলি কী তা ব্যাখ্যা করে।


1

হাইবারনেট টীকা বা অন্য কোনও উপায়ে সময় অঞ্চল নির্দিষ্ট করার অনুমতি দেয় না। আপনি যদি তারিখের পরিবর্তে ক্যালেন্ডার ব্যবহার করেন তবে আপনি হাইবারনেট সম্পত্তি অ্যাক্সেসটাইপ ব্যবহার করে নিজেই ম্যাপিং প্রয়োগ করতে পারেন ar আরও উন্নত সমাধান হ'ল আপনার তারিখ বা ক্যালেন্ডার মানচিত্রের জন্য একটি কাস্টম ব্যবহারকারী টাইপ প্রয়োগ করা। উভয় সমাধানগুলি এখানে আমার ব্লগ পোস্টে ব্যাখ্যা করা হয়েছে: http://www.joobik.com/2010/11/mapping-dates-and-time-zones-with.html

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