Group Blog
 
 
สิงหาคม 2552
 
 1
2345678
9101112131415
16171819202122
23242526272829
3031 
 
15 สิงหาคม 2552
 
All Blogs
 

วิธีการแก้ปัญหาเรื่อง date ระหว่าง java application กับ database oracle

ปัญหาเกี่ยวกับ Date ระหว่าง java application กับ oracle database ที่มักเจอกันบ่อยๆ ซึ่งผมก็สรุปแนวทางและวิธีแก้ปัญหาไว้ดังนี้
1. ปัญหาว่า database เก็บเป็น พ.ศ หรือ ค.ศ ให้ลอง run sql ดังนี้
select to_date('29/02/2008','dd/mm/yyyy') from dual;
ถ้าเก็บเป็น ค.ศ. จะ run ผ่าน ถ้าเก็บเป็น พ.ศ. จะ run ไม่ผ่านเพราะ พ.ศ. 2008 ไม่มีวันที่ 29 เดือนกุมภาพันธ์


2. การกำหนด Locale ของ java application หรือ java application server จะไปกำหนดที่  Control Panel -> Regional and Language Options -> Standards and formats
ถ้ากำหนดเป็น thai Locale จะเป็น พ.ศ. ถ้ากำหนดเป็น English Locale จะเป็น ค.ศ.
โดยสามารถ check ได้ว่า Locale ของเครื่องเป็น ค.ศ. หรือ พ.ศ. ได้จากคำสั่ง
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(new Timestamp(System.currentTimeMillis())));
คำสั่งนี้จะแสดง วัน/เดือน/ปี ของระบบโดยแสดง Locale ตาม default ของเครื่อง


3. ปกติคำสั่ง new Date(); ไม่ว่าเราจะ set Locale เป็น thai หรือ English ก็ตาม คำสั่งนี้จะแสดงค่าเป็น ค.ศ เสมอ
เช่นเดียวกับ การกำหนด Locale ให้ SimpleDateFormat เช่น
Locale lc = new Locale("th","TH");
System.out.println(new SimpleDateFormat("dd/MM/yyyy",lc).format(new Timestamp(System.currentTimeMillis())));
ค่าจะแสดงเป็นพ.ศ. เสมอไม่ว่าเราจะ set Locale ที่เครื่องเป็นอย่างไรก็ตาม


4. ปัญหาที่เกิดเรื่อง date ระหว่าง ฐานข้อมูล oracle กับ Java Application หรือ Java Application Server คือ oracle database จะเก็บข้อมูลเป็น ค.ศ. และ เครื่อง server เรามัก set Locale เป็น thai
เมื่อเรา query ข้อมูลจาก database ขึ้นมาเป็น ค.ศ 2009 java application server จะเข้าใจว่า 2009 คือ พ.ศ. ดังนั้นเวลาเราแสดงผลลัพธ์ java application server จะแสดง default ของ java เป็น ค.ศ.
ซึ่งจะแสดงเป็น 2009 - 543 = 1466
เสร็จแล้วเมื่อเราใช้คำสั่ง
Locale lc = new Locale("th","TH");
System.out.println(new SimpleDateFormat("dd/MM/yyyy",lc).format(new Timestamp(System.currentTimeMillis())));
เพื่อต้องการให้แสดงเป็น พ.ศ. ผลลัพธ์ที่ได้ก็จะแสดงเป็น 2009 แทนที่จะแสดงเป็น 2552 ปัญหานี้แก้โดย
1. กำหนด Locale ของเครื่อง เป็น English ซึ่งจะทำให้ java application server เข้าใจว่า ข้อมูลที่ได้รับนั้นเป็น ค.ศ. ทำให้ เมื่อแสดงผลลัพธ์ java application server จะไม่นำ 2009 ไป ลบ 543 และจะแสดง เป็น ค.ศ. 2009 เลย
เมื่อเราใช้คำสั่ง
Locale lc = new Locale("th","TH");
System.out.println(new SimpleDateFormat("dd/MM/yyyy",lc).format(new Date(ObjectDateGetFormDatabase.getTime()));
ระบบก็จะแสดงเป็นปี พ.ศ. ได้ตามปกติ

2. ถ้าไม่สามารถแก้ Locale ของเครื่องให้เป็น English ได้ เนื่องจากอาจจะกระทบกับฐานข้อมูลอื่นๆเช่น Access ต้องใช้วิธีแก้ตรง คำสั่ง sql ที่ใช้ query ข้อมูลดังนี้
select to_char(sysdate, 'dd/MM/yyyy', 'NLS_CALENDAR=''Thai Buddha'' NLS_DATE_LANGUAGE=THAI') from dual
คือบอกให้ข้อมูลที่เราต้องการแสดงนั้นแสดงเป็น ปี พ.ศ.เลย


ถ้าหากใครนำไปใช้แล้วมีข้อผิดพลาด หรือ ข้อแนะนำประการใด รบกวน ส่ง e-mail(gaiprime@hotmail.com) บอกผมด้วยนะครับ เพราะผมจะได้ปรับปรุงหรือหาข้อมูลเพิ่มเติมมาให้ครับ




 

Create Date : 15 สิงหาคม 2552
2 comments
Last Update : 15 สิงหาคม 2552 23:35:43 น.
Counter : 6179 Pageviews.

 

ขอบพระคุณจากใจเลยครับ การเผยแพร่ความรู้ครั้งนี้ของคุณช่วยชีวิตผมไว้ได้เลยคับ

ขอบคุณครับ

 

โดย: โก้ IP: 202.12.118.61 19 ตุลาคม 2552 12:31:57 น.  

 

ขอบพระคุณเช่นกันคับ

 

โดย: โย IP: 222.123.150.117 6 มกราคม 2553 22:26:29 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 
รหัสส่งข้อความ
กรุณายืนยันรหัสส่งข้อความ


gaiprime
Location :


[ดู Profile ทั้งหมด]

ให้ทิปเจ้าของ Blog [?]
ฝากข้อความหลังไมค์
Rss Feed

ผู้ติดตามบล็อก : 1 คน [?]




Friends' blogs
[Add gaiprime's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.