Hmm sulit sekali lepas dari kata OpenERP.. harusnya Odoo yaa hehe ..
iya ini tentang konsep datetime di OE 7 dan 8. hmm sebenarnya juga OE 6.1
Memang konsep ini dimulai sejak OE 6.1
Sedangkan di OE 6.0 masih "normal"
Maksudnya gimana nih?
Dulu di OE 6.0 kalau kita input datetime 06/12/2014 07:30:58
maka saat disimpan di database juga disimpan sebagai 06/12/2014 07:30:58
Sedangkan, mulai di OE 6.1 dst, maka akan disimpan di Postgre sebagai datetime yang dikembalikan ke basic UTC yaitu UTC+0 sesuai timezone masing-masing user
Di masing-masing user, ada preferences untuk setting local timezone. Contoh saya set timezone Asia/Jakarta (UTC+7). Nah maka ketika saya input 06/12/2014 07:30:58 maka akan disimpan sebagai 06/12/2014 00:30:58
Sedangkan jika ada user lain di UTC-2 misalkan, dengan input yang sama maka akan disimpan sebagai 06/12/2014 09:30:58
Nope, ini BUKAN BUGS. Ini memang disain yang dibuat demikian.
Nah terus apa masalahnya?
toh nanti pas tampil tetap sesuai timezone yang dipilih tiap user?
betul... di web tentu akan tampil sesuai timezone kita... gak perduli dengan timezone yg kita set di laptop. semua hanya dipengaruhi timezone yg diset di masing-masing user. cmiiw
Masalahnya adalah ketika berhubungan dengan report.
Kalau kita buat report pakai RML standard, sudah ada solusinya, yaitu
pakai [[ formatLang(fielddatetime, datetime=True) ]]
Nah kalau pakai query misalnya, atau pakai browse biasa... maksudnya buat function di *.py untuk menghasilkan datetime sesuai timezone, nah itu yang jadi masalah...
Jadi ceritanya beberapa minggu lalu, saya dapat task untuk export data ke dalam xls. Saat itu saya menggunakan python-xlwt (HINT: xlsxwriter ternyata lebih powerful lho. Saya gak pake aeroo ya.. krn pada kenyataannya dengan langsung generate dengan xlwt/xlxwriter akan jauuuuuuuuuuuuh lebih cepat saat generate data banyak..
Lalu saya gunakan browse biasa kemudian read field datetime, maka akan keluar datetime dengan basic UTC. Dan si user yang request modul ini jadi protes, karena gak sesuai dengan timezone mereka...
yaudah pakai formatLang aja?
sayangnya hanya bisa dipakai di rml saja.. cmiiw
terus gimana?
Alhamdulillah, setelah ngubek2 src code dan gugling sana sini, dapatlah solusi ini...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object_datas = self.pool.get('an.object').browse(cr, uid, object_ids) | |
for m in object_datas: | |
start = datetime.strptime(m.date, "%Y-%m-%d %H:%M:%S") | |
user = self.pool.get('res.users').browse(cr, uid, uid) | |
tz = pytz.timezone(user.tz) if user.tz else pytz.utc | |
start = pytz.utc.localize(start).astimezone(tz) # convert start in user's timezone | |
start_date = start.strftime("%Y-%m-%d %H:%M:%S") |
Nah selanjutnya tinggal disesuaikan deh mau ambil timezone dari mana.
kalau di code tsb, diambil dari timezone user yg login.
kalau misalnya untuk lembur, mungkin disesuaikan dengan timezone masing2 karyawan. karena bisa jadi karyawan nya tersebar di penjuru dunia dengan berbagai variasi timezone.
Demikian
semoga bermanfaat
kalau ada yang salah mohon bantu koreksi yaa
terima kasih