Why does Oracle change my date fields?
DBTIMEZONE is different than host machine timezone, and it needs to be set up separately (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions039.htm)  .   

The first step is to change DBTIMEZONE to Moscow so it matches server settings which always makes sense.   As a side effect, you will have your current issues "solved" because now db timezone also matches application server timezone . 

However, I'd not recommend to stop at this point unless you can always run Oracle and java application[s] with Moscow timezone settings.  It may be feasible in some cases, but it's not very robust solution.  It easily turns to nightmare when you have to deal with switching to daylight saving time . 

I'd rather change application to always store datetime in UTC , and perform all necessary conversion on application side before displaying date to the end user. 
Another option you can try is replacing DATE columns with one of Oracle timezone aware types (TIMESTAMP WITH LOCAL TIMEZONE or TIMESTAMP WITH TIMEZONE).